Fix more hound warnings
This commit is contained in:
@@ -11,14 +11,14 @@ class Admin::Dashboard::ActionsController < Admin::Dashboard::BaseController
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
request_to_administrators: false,
|
||||
action_type: 'proposed_action'
|
||||
action_type: "proposed_action"
|
||||
)
|
||||
end
|
||||
|
||||
def create
|
||||
@dashboard_action = ::Dashboard::Action.new(dashboard_action_params)
|
||||
if @dashboard_action.save
|
||||
redirect_to admin_dashboard_actions_path, notice: t('admin.dashboard.actions.create.notice')
|
||||
redirect_to admin_dashboard_actions_path, notice: t("admin.dashboard.actions.create.notice")
|
||||
else
|
||||
render :new
|
||||
end
|
||||
@@ -36,9 +36,9 @@ class Admin::Dashboard::ActionsController < Admin::Dashboard::BaseController
|
||||
|
||||
def destroy
|
||||
if dashboard_action.destroy
|
||||
flash[:notice] = t('admin.dashboard.actions.delete.success')
|
||||
flash[:notice] = t("admin.dashboard.actions.delete.success")
|
||||
else
|
||||
flash[:error] = dashboard_action.errors.full_messages.join(',')
|
||||
flash[:error] = dashboard_action.errors.full_messages.join(",")
|
||||
end
|
||||
|
||||
redirect_to admin_dashboard_actions_path
|
||||
@@ -46,30 +46,30 @@ class Admin::Dashboard::ActionsController < Admin::Dashboard::BaseController
|
||||
|
||||
private
|
||||
|
||||
def resource
|
||||
@dashboard_action
|
||||
end
|
||||
def resource
|
||||
@dashboard_action
|
||||
end
|
||||
|
||||
def dashboard_action_params
|
||||
params
|
||||
.require(:dashboard_action)
|
||||
.permit(
|
||||
:title, :description, :short_description, :request_to_administrators, :day_offset,
|
||||
:required_supports, :order, :active, :action_type, :published_proposal,
|
||||
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
|
||||
links_attributes: [:id, :label, :url, :open_in_new_tab, :_destroy]
|
||||
)
|
||||
end
|
||||
def dashboard_action_params
|
||||
params
|
||||
.require(:dashboard_action)
|
||||
.permit(
|
||||
:title, :description, :short_description, :request_to_administrators, :day_offset,
|
||||
:required_supports, :order, :active, :action_type, :published_proposal,
|
||||
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
|
||||
links_attributes: [:id, :label, :url, :open_in_new_tab, :_destroy]
|
||||
)
|
||||
end
|
||||
|
||||
def dashboard_action
|
||||
@dashboard_action ||= ::Dashboard::Action.find(params[:id])
|
||||
end
|
||||
def dashboard_action
|
||||
@dashboard_action ||= ::Dashboard::Action.find(params[:id])
|
||||
end
|
||||
|
||||
def proposed_actions
|
||||
::Dashboard::Action.proposed_actions.order(order: :asc)
|
||||
end
|
||||
def proposed_actions
|
||||
::Dashboard::Action.proposed_actions.order(order: :asc)
|
||||
end
|
||||
|
||||
def resources
|
||||
::Dashboard::Action.resources.order(required_supports: :asc, day_offset: :asc)
|
||||
end
|
||||
def resources
|
||||
::Dashboard::Action.resources.order(required_supports: :asc, day_offset: :asc)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -20,7 +20,7 @@ class Admin::Dashboard::AdministratorTasksController < Admin::Dashboard::BaseCon
|
||||
|
||||
private
|
||||
|
||||
def administrator_task
|
||||
@administrator_task ||= ::Dashboard::AdministratorTask.find(params[:id])
|
||||
end
|
||||
def administrator_task
|
||||
@administrator_task ||= ::Dashboard::AdministratorTask.find(params[:id])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,7 +3,7 @@ class Admin::Dashboard::BaseController < Admin::BaseController
|
||||
|
||||
private
|
||||
|
||||
def namespace
|
||||
'admin'
|
||||
end
|
||||
def namespace
|
||||
"admin"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
class Admin::SettingsController < Admin::BaseController
|
||||
include Admin::ManagesProposalSettings
|
||||
|
||||
helper_method :successful_proposal_setting, :successful_proposals, :poll_feature_short_title_setting, :poll_feature_description_setting,
|
||||
:poll_feature_link_setting, :email_feature_short_title_setting, :email_feature_description_setting,
|
||||
helper_method :successful_proposal_setting, :successful_proposals,
|
||||
:poll_feature_short_title_setting, :poll_feature_description_setting,
|
||||
:poll_feature_link_setting, :email_feature_short_title_setting,
|
||||
:email_feature_description_setting,
|
||||
:poster_feature_short_title_setting, :poster_feature_description_setting
|
||||
|
||||
def index
|
||||
@@ -16,7 +18,7 @@ class Admin::SettingsController < Admin::BaseController
|
||||
def update
|
||||
@setting = Setting.find(params[:id])
|
||||
@setting.update(settings_params)
|
||||
redirect_to request.referer, notice: t('admin.settings.flash.updated')
|
||||
redirect_to request.referer, notice: t("admin.settings.flash.updated")
|
||||
end
|
||||
|
||||
def update_map
|
||||
|
||||
@@ -3,7 +3,7 @@ module Admin::ManagesProposalSettings
|
||||
|
||||
included do
|
||||
def successful_proposal_setting
|
||||
@successful_proposal_setting ||= Setting.find_by(key: 'proposals.successful_proposal_id')
|
||||
@successful_proposal_setting ||= Setting.find_by(key: "proposals.successful_proposal_id")
|
||||
end
|
||||
|
||||
def successful_proposals
|
||||
@@ -11,31 +11,31 @@ module Admin::ManagesProposalSettings
|
||||
end
|
||||
|
||||
def poll_feature_short_title_setting
|
||||
@poll_feature_short_title_setting ||= Setting.find_by(key: 'proposals.poll_short_title')
|
||||
@poll_feature_short_title_setting ||= Setting.find_by(key: "proposals.poll_short_title")
|
||||
end
|
||||
|
||||
def poll_feature_description_setting
|
||||
@poll_feature_description_setting ||= Setting.find_by(key: 'proposals.poll_description')
|
||||
@poll_feature_description_setting ||= Setting.find_by(key: "proposals.poll_description")
|
||||
end
|
||||
|
||||
def poll_feature_link_setting
|
||||
@poll_feature_link_setting ||= Setting.find_by(key: 'proposals.poll_link')
|
||||
@poll_feature_link_setting ||= Setting.find_by(key: "proposals.poll_link")
|
||||
end
|
||||
|
||||
|
||||
def email_feature_short_title_setting
|
||||
@email_feature_short_title_setting ||= Setting.find_by(key: 'proposals.email_short_title')
|
||||
@email_feature_short_title_setting ||= Setting.find_by(key: "proposals.email_short_title")
|
||||
end
|
||||
|
||||
|
||||
def email_feature_description_setting
|
||||
@email_feature_description_setting ||= Setting.find_by(key: 'proposals.email_description')
|
||||
@email_feature_description_setting ||= Setting.find_by(key: "proposals.email_description")
|
||||
end
|
||||
|
||||
def poster_feature_short_title_setting
|
||||
@poster_feature_short_title_setting ||= Setting.find_by(key: 'proposals.poster_short_title')
|
||||
@poster_feature_short_title_setting ||= Setting.find_by(key: "proposals.poster_short_title")
|
||||
end
|
||||
|
||||
def poster_feature_description_setting
|
||||
@poster_feature_description_setting ||= Setting.find_by(key: 'proposals.poster_description')
|
||||
@poster_feature_description_setting ||= Setting.find_by(key: "proposals.poster_description")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -45,11 +45,12 @@ module Dashboard::GroupSupports
|
||||
end
|
||||
|
||||
def interval
|
||||
return 1.week if params[:group_by] == 'week'
|
||||
return 1.month if params[:group_by] == 'month'
|
||||
return 1.week if params[:group_by] == "week"
|
||||
return 1.month if params[:group_by] == "month"
|
||||
1.day
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def calculate_week(date)
|
||||
|
||||
@@ -8,37 +8,40 @@ class Dashboard::AchievementsController < Dashboard::BaseController
|
||||
|
||||
private
|
||||
|
||||
def processed_groups
|
||||
grouped_results = groups
|
||||
grouped_results.each do |key, results|
|
||||
grouped_results[key] = {
|
||||
executed_at: results.last.executed_at,
|
||||
title: results.last.action.title
|
||||
}
|
||||
def processed_groups
|
||||
grouped_results = groups
|
||||
grouped_results.each do |key, results|
|
||||
grouped_results[key] = {
|
||||
executed_at: results.last.executed_at,
|
||||
title: results.last.action.title
|
||||
}
|
||||
end
|
||||
|
||||
grouped_results
|
||||
end
|
||||
|
||||
grouped_results
|
||||
end
|
||||
def groups
|
||||
if params[:group_by] == "week"
|
||||
return executed_proposed_actions.group_by {
|
||||
|v| "#{v.executed_at.to_date.cweek}/#{v.executed_at.to_date.year}" }
|
||||
end
|
||||
|
||||
def groups
|
||||
if params[:group_by] == 'week'
|
||||
return executed_proposed_actions.group_by { |v| "#{v.executed_at.to_date.cweek}/#{v.executed_at.to_date.year}"}
|
||||
if params[:group_by] == "month"
|
||||
return executed_proposed_actions.group_by {
|
||||
|v| "#{v.executed_at.to_date.year}-#{v.executed_at.to_date.month}" }
|
||||
end
|
||||
|
||||
executed_proposed_actions.group_by { |a| a.executed_at.to_date }
|
||||
end
|
||||
|
||||
if params[:group_by] == 'month'
|
||||
return executed_proposed_actions.group_by { |v| "#{v.executed_at.to_date.year}-#{v.executed_at.to_date.month}"}
|
||||
def executed_proposed_actions
|
||||
@executed_proposed_actions ||=
|
||||
Dashboard::ExecutedAction
|
||||
.joins(:action)
|
||||
.includes(:action)
|
||||
.where(proposal: proposal)
|
||||
.where(executed_at: start_date.beginning_of_day..end_date.end_of_day)
|
||||
.where(dashboard_actions: { action_type: 0 })
|
||||
.order(executed_at: :asc)
|
||||
end
|
||||
|
||||
executed_proposed_actions.group_by { |a| a.executed_at.to_date }
|
||||
end
|
||||
|
||||
def executed_proposed_actions
|
||||
@executed_proposed_actions ||= Dashboard::ExecutedAction
|
||||
.joins(:action)
|
||||
.includes(:action)
|
||||
.where(proposal: proposal)
|
||||
.where(executed_at: start_date.beginning_of_day..end_date.end_of_day)
|
||||
.where(dashboard_actions: { action_type: 0 })
|
||||
.order(executed_at: :asc)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,9 +19,10 @@ class Dashboard::ActionsController < Dashboard::BaseController
|
||||
if @dashboard_executed_action.save
|
||||
Dashboard::AdministratorTask.create(source: @dashboard_executed_action)
|
||||
|
||||
redirect_to progress_proposal_dashboard_path(proposal.to_param), { flash: { info: t('dashboard.create_request.success') } }
|
||||
redirect_to progress_proposal_dashboard_path(proposal.to_param),
|
||||
{ flash: { info: t("dashboard.create_request.success") } }
|
||||
else
|
||||
flash.now[:alert] = @dashboard_executed_action.errors.full_messages.join('<br>')
|
||||
flash.now[:alert] = @dashboard_executed_action.errors.full_messages.join("<br>")
|
||||
render :new_request
|
||||
end
|
||||
end
|
||||
@@ -29,13 +30,14 @@ class Dashboard::ActionsController < Dashboard::BaseController
|
||||
def execute
|
||||
authorize! :dashboard, proposal
|
||||
|
||||
Dashboard::ExecutedAction.create(proposal: proposal, action: dashboard_action, executed_at: Time.now)
|
||||
Dashboard::ExecutedAction.create(proposal: proposal, action: dashboard_action,
|
||||
executed_at: Time.now)
|
||||
redirect_to request.referer
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dashboard_action
|
||||
@dashboard_action ||= Dashboard::Action.find(params[:id])
|
||||
end
|
||||
def dashboard_action
|
||||
@dashboard_action ||= Dashboard::Action.find(params[:id])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,41 +3,45 @@ class Dashboard::BaseController < ApplicationController
|
||||
|
||||
include Dashboard::HasProposal
|
||||
|
||||
helper_method :proposal, :proposed_actions, :resource, :resources, :next_goal, :next_goal_supports, :next_goal_progress, :community_members_count
|
||||
helper_method :proposal, :proposed_actions, :resource, :resources, :next_goal,
|
||||
:next_goal_supports, :next_goal_progress, :community_members_count
|
||||
|
||||
respond_to :html
|
||||
layout 'dashboard'
|
||||
layout "dashboard"
|
||||
|
||||
private
|
||||
|
||||
def proposed_actions
|
||||
@proposed_actions ||= Dashboard::Action.proposed_actions.active_for(proposal).order(order: :asc)
|
||||
end
|
||||
|
||||
def resources
|
||||
@resources ||= Dashboard::Action.resources.active_for(proposal).order(order: :asc)
|
||||
end
|
||||
|
||||
def next_goal_supports
|
||||
@next_goal_supports ||= next_goal&.required_supports || Setting["votes_for_proposal_success"]
|
||||
end
|
||||
|
||||
def next_goal_progress
|
||||
@next_goal_progress ||= (proposal.votes_for.size * 100) / next_goal_supports.to_i
|
||||
end
|
||||
|
||||
def community_members_count
|
||||
Rails.cache.fetch("community/#{proposal.community.id}/participants_count", expires_in: 1.hour) do
|
||||
proposal.community.participants.count
|
||||
def proposed_actions
|
||||
@proposed_actions ||= Dashboard::Action.proposed_actions.active_for(proposal)
|
||||
.order(order: :asc)
|
||||
end
|
||||
end
|
||||
|
||||
def next_goal
|
||||
@next_goal ||= Dashboard::Action.next_goal_for(proposal)
|
||||
end
|
||||
def resources
|
||||
@resources ||= Dashboard::Action.resources.active_for(proposal).order(order: :asc)
|
||||
end
|
||||
|
||||
def detect_new_actions_after_last_login
|
||||
author_last_login = proposal.author.last_sign_in_at.to_date
|
||||
@new_actions_since_last_login = Dashboard::Action.detect_new_actions_since(author_last_login, proposal)
|
||||
end
|
||||
def next_goal_supports
|
||||
@next_goal_supports ||= next_goal&.required_supports || Setting["votes_for_proposal_success"]
|
||||
end
|
||||
|
||||
def next_goal_progress
|
||||
@next_goal_progress ||= (proposal.votes_for.size * 100) / next_goal_supports.to_i
|
||||
end
|
||||
|
||||
def community_members_count
|
||||
Rails.cache.fetch("community/#{proposal.community.id}/participants_count",
|
||||
expires_in: 1.hour) do
|
||||
proposal.community.participants.count
|
||||
end
|
||||
end
|
||||
|
||||
def next_goal
|
||||
@next_goal ||= Dashboard::Action.next_goal_for(proposal)
|
||||
end
|
||||
|
||||
def detect_new_actions_after_last_login
|
||||
author_last_login = proposal.author.last_sign_in_at.to_date
|
||||
@new_actions_since_last_login = Dashboard::Action.detect_new_actions_since(author_last_login,
|
||||
proposal)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,6 +11,7 @@ class Dashboard::MailingController < Dashboard::BaseController
|
||||
authorize! :manage_mailing, proposal
|
||||
|
||||
Dashboard::Mailer.forward(proposal).deliver_later
|
||||
redirect_to new_proposal_dashboard_mailing_path(proposal), flash: { notice: t("dashboard.mailing.create.sent") }
|
||||
redirect_to new_proposal_dashboard_mailing_path(proposal),
|
||||
flash: { notice: t("dashboard.mailing.create.sent") }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,7 +15,8 @@ class Dashboard::PollsController < Dashboard::BaseController
|
||||
def create
|
||||
authorize! :manage_polls, proposal
|
||||
|
||||
@poll = Poll.new(poll_params.merge(author: current_user, related: proposal, stats_enabled: false))
|
||||
@poll = Poll.new(poll_params.merge(author: current_user, related: proposal,
|
||||
stats_enabled: false))
|
||||
if @poll.save
|
||||
redirect_to proposal_dashboard_polls_path(proposal), notice: t("flash.actions.create.poll")
|
||||
else
|
||||
@@ -32,7 +33,8 @@ class Dashboard::PollsController < Dashboard::BaseController
|
||||
|
||||
respond_to do |format|
|
||||
if poll.update(poll_params)
|
||||
format.html { redirect_to proposal_dashboard_polls_path(proposal), notice: t("flash.actions.update.poll") }
|
||||
format.html { redirect_to proposal_dashboard_polls_path(proposal),
|
||||
notice: t("flash.actions.update.poll") }
|
||||
format.json { respond_with_bip(poll) }
|
||||
else
|
||||
format.html { render :edit }
|
||||
@@ -43,30 +45,30 @@ class Dashboard::PollsController < Dashboard::BaseController
|
||||
|
||||
private
|
||||
|
||||
def poll
|
||||
@poll ||= Poll.includes(:questions).find(params[:id])
|
||||
end
|
||||
def poll
|
||||
@poll ||= Poll.includes(:questions).find(params[:id])
|
||||
end
|
||||
|
||||
def poll_params
|
||||
params.require(:poll).permit(poll_attributes)
|
||||
end
|
||||
def poll_params
|
||||
params.require(:poll).permit(poll_attributes)
|
||||
end
|
||||
|
||||
def poll_attributes
|
||||
[:name, :starts_at, :ends_at, :description,
|
||||
:results_enabled, :stats_enabled,
|
||||
questions_attributes: question_attributes]
|
||||
end
|
||||
def poll_attributes
|
||||
[:name, :starts_at, :ends_at, :description, :results_enabled, :stats_enabled,
|
||||
questions_attributes: question_attributes]
|
||||
end
|
||||
|
||||
def question_attributes
|
||||
[:id, :title, :author_id, :proposal_id, :_destroy, question_answers_attributes: question_answers_attributes]
|
||||
end
|
||||
def question_attributes
|
||||
[:id, :title, :author_id, :proposal_id, :_destroy,
|
||||
question_answers_attributes: question_answers_attributes]
|
||||
end
|
||||
|
||||
def question_answers_attributes
|
||||
[:id, :_destroy, :title, :description, :given_order, :question_id,
|
||||
documents_attributes: documents_attributes]
|
||||
end
|
||||
def question_answers_attributes
|
||||
[:id, :_destroy, :title, :description, :given_order, :question_id,
|
||||
documents_attributes: documents_attributes]
|
||||
end
|
||||
|
||||
def documents_attributes
|
||||
[:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
|
||||
end
|
||||
def documents_attributes
|
||||
[:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,11 +5,11 @@ class Dashboard::PosterController < Dashboard::BaseController
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.pdf do
|
||||
render pdf: 'poster',
|
||||
page_size: 'A4',
|
||||
render pdf: "poster",
|
||||
page_size: "A4",
|
||||
dpi: 300,
|
||||
zoom: 0.32,
|
||||
show_as_html: Rails.env.test? || params.key?('debug'),
|
||||
show_as_html: Rails.env.test? || params.key?("debug"),
|
||||
margin: { top: 0 }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
class Dashboard::ResourcesController < Dashboard::BaseController
|
||||
class Dashboard::ResourcesController < Dashboard::BaseController
|
||||
skip_authorization_check
|
||||
|
||||
def index
|
||||
@resources = Dashboard::Action
|
||||
.active
|
||||
.resources
|
||||
.where('required_supports > 0')
|
||||
.where("required_supports > 0")
|
||||
.order(required_supports: :asc)
|
||||
|
||||
render json: @resources.map { |resource|
|
||||
|
||||
@@ -9,30 +9,31 @@ class Dashboard::SuccessfulSupportsController < Dashboard::BaseController
|
||||
|
||||
private
|
||||
|
||||
def accumulated_grouped_supports
|
||||
grouped_votes = grouped_supports(:voted_at)
|
||||
grouped_votes = fill_holes(grouped_votes)
|
||||
accumulate_supports(grouped_votes)
|
||||
end
|
||||
def accumulated_grouped_supports
|
||||
grouped_votes = grouped_supports(:voted_at)
|
||||
grouped_votes = fill_holes(grouped_votes)
|
||||
accumulate_supports(grouped_votes)
|
||||
end
|
||||
|
||||
def supports
|
||||
return [] if successful_proposal.nil?
|
||||
def supports
|
||||
return [] if successful_proposal.nil?
|
||||
|
||||
Vote
|
||||
.select("created_at + interval '#{days_diff} day' voted_at, *")
|
||||
.where(votable: successful_proposal)
|
||||
.where("created_at + interval '#{days_diff} day' between ? and ?", start_date.beginning_of_day, end_date.end_of_day)
|
||||
.order(created_at: :asc)
|
||||
end
|
||||
Vote
|
||||
.select("created_at + interval '#{days_diff} day' voted_at, *")
|
||||
.where(votable: successful_proposal)
|
||||
.where("created_at + interval '#{days_diff} day' between ? and ?",
|
||||
start_date.beginning_of_day, end_date.end_of_day)
|
||||
.order(created_at: :asc)
|
||||
end
|
||||
|
||||
def successful_proposal
|
||||
@successful_proposal ||= Proposal.find_by(id: Setting['proposals.successful_proposal_id'])
|
||||
end
|
||||
def successful_proposal
|
||||
@successful_proposal ||= Proposal.find_by(id: Setting["proposals.successful_proposal_id"])
|
||||
end
|
||||
|
||||
def days_diff
|
||||
return 0 if successful_proposal.nil?
|
||||
return 0 if proposal.published_at.nil?
|
||||
def days_diff
|
||||
return 0 if successful_proposal.nil?
|
||||
return 0 if proposal.published_at.nil?
|
||||
|
||||
(proposal.published_at.to_date - successful_proposal.published_at.to_date).to_i
|
||||
end
|
||||
(proposal.published_at.to_date - successful_proposal.published_at.to_date).to_i
|
||||
end
|
||||
end
|
||||
|
||||
@@ -9,16 +9,17 @@ class Dashboard::SupportsController < Dashboard::BaseController
|
||||
|
||||
private
|
||||
|
||||
def accumulated_supports
|
||||
grouped_votes = grouped_supports(:created_at)
|
||||
grouped_votes = fill_holes(grouped_votes)
|
||||
accumulate_supports(grouped_votes)
|
||||
end
|
||||
def accumulated_supports
|
||||
grouped_votes = grouped_supports(:created_at)
|
||||
grouped_votes = fill_holes(grouped_votes)
|
||||
accumulate_supports(grouped_votes)
|
||||
end
|
||||
|
||||
|
||||
def supports
|
||||
@supports ||= Vote
|
||||
.where(votable: proposal, created_at: start_date.beginning_of_day..end_date.end_of_day)
|
||||
|
||||
def supports
|
||||
@supports ||= Vote
|
||||
.where(votable: proposal,
|
||||
created_at: start_date.beginning_of_day..end_date.end_of_day)
|
||||
.order(created_at: :asc)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -27,19 +27,19 @@ class DashboardController < Dashboard::BaseController
|
||||
|
||||
private
|
||||
|
||||
def active_resources
|
||||
@active_resources ||= Dashboard::Action.active
|
||||
.resources
|
||||
.by_proposal(proposal)
|
||||
.order(required_supports: :asc, day_offset: :asc)
|
||||
end
|
||||
def active_resources
|
||||
@active_resources ||= Dashboard::Action.active
|
||||
.resources
|
||||
.by_proposal(proposal)
|
||||
.order(required_supports: :asc, day_offset: :asc)
|
||||
end
|
||||
|
||||
def course
|
||||
@course ||= Dashboard::Action.course_for(proposal)
|
||||
end
|
||||
def course
|
||||
@course ||= Dashboard::Action.course_for(proposal)
|
||||
end
|
||||
|
||||
def set_done_and_pending_actions
|
||||
@done_actions = proposed_actions.joins(:proposals).where("proposals.id = ?", proposal.id)
|
||||
@pending_actions = proposed_actions - @done_actions
|
||||
end
|
||||
def set_done_and_pending_actions
|
||||
@done_actions = proposed_actions.joins(:proposals).where("proposals.id = ?", proposal.id)
|
||||
@pending_actions = proposed_actions - @done_actions
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,7 +17,7 @@ class ProposalsController < ApplicationController
|
||||
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
|
||||
has_orders %w[most_voted newest oldest], only: :show
|
||||
|
||||
load_and_authorize_resource
|
||||
helper_method :resource_model, :resource_name
|
||||
@@ -27,9 +27,12 @@ class ProposalsController < ApplicationController
|
||||
super
|
||||
@notifications = @proposal.notifications
|
||||
@notifications = @proposal.notifications.not_moderated
|
||||
@related_contents = Kaminari.paginate_array(@proposal.relationed_contents).page(params[:page]).per(5)
|
||||
@related_contents = Kaminari.paginate_array(@proposal.relationed_contents)
|
||||
.page(params[:page]).per(5)
|
||||
|
||||
redirect_to proposal_path(@proposal), status: :moved_permanently if request.path != proposal_path(@proposal)
|
||||
if request.path != proposal_path(@proposal)
|
||||
redirect_to proposal_path(@proposal), status: :moved_permanently
|
||||
end
|
||||
end
|
||||
|
||||
def create
|
||||
@@ -87,16 +90,17 @@ class ProposalsController < ApplicationController
|
||||
|
||||
def publish
|
||||
@proposal.publish
|
||||
redirect_to share_proposal_path(@proposal), notice: t('proposals.notice.published')
|
||||
redirect_to share_proposal_path(@proposal), notice: t("proposals.notice.published")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def proposal_params
|
||||
params.require(:proposal).permit(:title, :question, :summary, :description, :external_url, :video_url,
|
||||
:responsible_name, :tag_list, :terms_of_service, :geozone_id, :skip_map,
|
||||
image_attributes: image_attributes,
|
||||
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
|
||||
params.require(:proposal).permit(:title, :question, :summary, :description, :external_url,
|
||||
:video_url, :responsible_name, :tag_list, :terms_of_service,
|
||||
:geozone_id, :skip_map, image_attributes: image_attributes,
|
||||
documents_attributes: [:id, :title, :attachment,
|
||||
:cached_attachment, :user_id, :_destroy],
|
||||
map_location_attributes: [:latitude, :longitude, :zoom])
|
||||
end
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module Admin::ProposalDashboardActionsHelper
|
||||
def active_human_readable(active)
|
||||
return t('admin.dashboard.actions.index.active') if active
|
||||
t('admin.dashboard.actions.index.inactive')
|
||||
return t("admin.dashboard.actions.index.active") if active
|
||||
t("admin.dashboard.actions.index.inactive")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -8,7 +8,8 @@ module ApplicationHelper
|
||||
end
|
||||
|
||||
# if current path is /debates current_path_with_query_params(foo: "bar") returns /debates?foo=bar
|
||||
# notice: if query_params have a param which also exist in current path, it "overrides" (query_params is merged last)
|
||||
# notice: if query_params have a param which also exist in current path,
|
||||
# it "overrides" (query_params is merged last)
|
||||
def current_path_with_query_params(query_parameters)
|
||||
url_for(request.query_parameters.merge(query_parameters))
|
||||
end
|
||||
@@ -58,7 +59,8 @@ module ApplicationHelper
|
||||
end
|
||||
|
||||
def self.asset_data_base64(path)
|
||||
asset = (Rails.application.assets || ::Sprockets::Railtie.build_environment(Rails.application)).find_asset(path)
|
||||
asset = (Rails.application.assets || ::Sprockets::Railtie.build_environment(Rails.application))
|
||||
.find_asset(path)
|
||||
throw "Could not find asset '#{path}'" if asset.nil?
|
||||
base64 = Base64.encode64(asset.to_s).gsub(/\s+/, "")
|
||||
"data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
module LinksHelper
|
||||
def render_destroy_element_link(builder, element)
|
||||
link_to_remove_association element.new_record? ? t('links.form.cancel_button') : t('links.form.delete_button') , builder, class: 'delete remove-element'
|
||||
link_to_remove_association element.new_record? ? t("links.form.cancel_button") :
|
||||
t("links.form.delete_button"),
|
||||
builder, class: "delete remove-element"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
module ProposalsDashboardHelper
|
||||
def my_proposal_menu_active?
|
||||
controller_name == 'dashboard' && action_name == 'show'
|
||||
controller_name == "dashboard" && action_name == "show"
|
||||
end
|
||||
|
||||
def community_menu_active?
|
||||
controller_name == 'dashboard' && action_name == 'community'
|
||||
controller_name == "dashboard" && action_name == "community"
|
||||
end
|
||||
|
||||
def progress_menu_active?
|
||||
is_proposed_action_request? || (controller_name == 'dashboard' && action_name == 'progress')
|
||||
is_proposed_action_request? || (controller_name == "dashboard" && action_name == "progress")
|
||||
end
|
||||
|
||||
def recommended_actions_menu_active?
|
||||
@@ -24,57 +24,61 @@ module ProposalsDashboardHelper
|
||||
end
|
||||
|
||||
def polls_menu_active?
|
||||
controller_name == 'polls'
|
||||
controller_name == "polls"
|
||||
end
|
||||
|
||||
def poster_menu_active?
|
||||
controller_name == 'poster'
|
||||
controller_name == "poster"
|
||||
end
|
||||
|
||||
def mailing_menu_active?
|
||||
controller_name == 'mailing'
|
||||
controller_name == "mailing"
|
||||
end
|
||||
|
||||
def is_resource_request?
|
||||
controller_name == 'dashboard' && action_name == 'new_request' && dashboard_action&.resource?
|
||||
controller_name == "dashboard" && action_name == "new_request" && dashboard_action&.resource?
|
||||
end
|
||||
|
||||
def is_proposed_action_request?
|
||||
controller_name == 'dashboard' && action_name == 'new_request' && dashboard_action&.proposed_action?
|
||||
controller_name == "dashboard" && action_name == "new_request" &&
|
||||
dashboard_action&.proposed_action?
|
||||
end
|
||||
|
||||
def is_request_active(id)
|
||||
controller_name == 'dashboard' && action_name == 'new_request' && dashboard_action&.id == id
|
||||
controller_name == "dashboard" && action_name == "new_request" && dashboard_action&.id == id
|
||||
end
|
||||
|
||||
def resoure_availability_label(resource)
|
||||
label = []
|
||||
|
||||
label << t("dashboard.resource.required_days", days: resource.day_offset) if resource.day_offset > 0
|
||||
label << t("dashboard.resource.required_supports", supports: number_with_delimiter(resource.required_supports, delimiter: '.')) if resource.required_supports > 0
|
||||
label << t("dashboard.resource.required_days",
|
||||
days: resource.day_offset) if resource.day_offset > 0
|
||||
label << t("dashboard.resource.required_supports",
|
||||
supports: number_with_delimiter(resource.required_supports,
|
||||
delimiter: ".")) if resource.required_supports > 0
|
||||
|
||||
label.join(" #{t("dashboard.resource.and")}<br>")
|
||||
end
|
||||
|
||||
def daily_selected_class
|
||||
return nil if params[:group_by].blank?
|
||||
'hollow'
|
||||
"hollow"
|
||||
end
|
||||
|
||||
def weekly_selected_class
|
||||
return nil if params[:group_by] == 'week'
|
||||
'hollow'
|
||||
return nil if params[:group_by] == "week"
|
||||
"hollow"
|
||||
end
|
||||
|
||||
def monthly_selected_class
|
||||
return nil if params[:group_by] == 'month'
|
||||
'hollow'
|
||||
return nil if params[:group_by] == "month"
|
||||
"hollow"
|
||||
end
|
||||
|
||||
def resource_card_class(resource, proposal)
|
||||
return 'alert' unless resource.active_for?(proposal)
|
||||
return 'success' if resource.executed_for?(proposal)
|
||||
'primary'
|
||||
return "alert" unless resource.active_for?(proposal)
|
||||
return "success" if resource.executed_for?(proposal)
|
||||
"primary"
|
||||
end
|
||||
|
||||
def resource_tooltip(resource, proposal)
|
||||
@@ -85,11 +89,15 @@ module ProposalsDashboardHelper
|
||||
end
|
||||
|
||||
def is_new_action_since_last_login?(proposed_action, new_actions_since_last_login)
|
||||
new_actions_since_last_login.include?(proposed_action.id) if new_actions_since_last_login.present?
|
||||
if new_actions_since_last_login.present?
|
||||
new_actions_since_last_login.include?(proposed_action.id)
|
||||
end
|
||||
end
|
||||
|
||||
def new_resources_since_last_login?(resources, new_actions_since_last_login)
|
||||
resources.pluck(:id).any? {|id| new_actions_since_last_login.include?(id) } if resources.present?
|
||||
if resources.present?
|
||||
resources.pluck(:id).any? {|id| new_actions_since_last_login.include?(id) }
|
||||
end
|
||||
end
|
||||
|
||||
def active_resources_for(proposal)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
class Dashboard::Mailer < ApplicationMailer
|
||||
layout 'mailer'
|
||||
layout "mailer"
|
||||
|
||||
def forward(proposal)
|
||||
@proposal = proposal
|
||||
@@ -9,28 +9,33 @@ class Dashboard::Mailer < ApplicationMailer
|
||||
def new_actions_notification_rake_published(proposal, new_actions_ids)
|
||||
@proposal = proposal
|
||||
@new_actions = get_new_actions(new_actions_ids)
|
||||
mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_rake_published.subject")
|
||||
mail to: proposal.author.email,
|
||||
subject: I18n.t("mailers.new_actions_notification_rake_published.subject")
|
||||
end
|
||||
|
||||
def new_actions_notification_rake_created(proposal, new_actions_ids)
|
||||
@proposal = proposal
|
||||
@new_actions = get_new_actions(new_actions_ids)
|
||||
mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_rake_created.subject")
|
||||
mail to: proposal.author.email,
|
||||
subject: I18n.t("mailers.new_actions_notification_rake_created.subject")
|
||||
end
|
||||
|
||||
def new_actions_notification_on_create(proposal)
|
||||
@proposal = proposal
|
||||
mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_on_create.subject")
|
||||
mail to: proposal.author.email,
|
||||
subject: I18n.t("mailers.new_actions_notification_on_create.subject")
|
||||
end
|
||||
|
||||
def new_actions_notification_on_published(proposal, new_actions_ids)
|
||||
@proposal = proposal
|
||||
@new_actions = get_new_actions(new_actions_ids)
|
||||
mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_on_published.subject")
|
||||
mail to: proposal.author.email,
|
||||
subject: I18n.t("mailers.new_actions_notification_on_published.subject")
|
||||
end
|
||||
|
||||
private
|
||||
def get_new_actions(new_actions_ids)
|
||||
Dashboard::Action.where(id: new_actions_ids)
|
||||
end
|
||||
|
||||
def get_new_actions(new_actions_ids)
|
||||
Dashboard::Action.where(id: new_actions_ids)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -6,4 +6,3 @@ module Linkable
|
||||
accepts_nested_attributes_for :links, allow_destroy: true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
module Dashboard
|
||||
def self.table_name_prefix
|
||||
'dashboard_'
|
||||
"dashboard_"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -13,7 +13,8 @@ class Dashboard::Action < ActiveRecord::Base
|
||||
acts_as_paranoid column: :hidden_at
|
||||
include ActsAsParanoidAliases
|
||||
|
||||
has_many :executed_actions, dependent: :restrict_with_error, class_name: "Dashboard::ExecutedAction"
|
||||
has_many :executed_actions, dependent: :restrict_with_error,
|
||||
class_name: "Dashboard::ExecutedAction"
|
||||
has_many :proposals, through: :executed_actions
|
||||
|
||||
enum action_type: [:proposed_action, :resource]
|
||||
|
||||
@@ -7,5 +7,5 @@ class Dashboard::AdministratorTask < ActiveRecord::Base
|
||||
default_scope { order(created_at: :asc) }
|
||||
|
||||
scope :pending, -> { where(executed_at: nil) }
|
||||
scope :done, -> { where.not(executed_at: nil) }
|
||||
scope :done, -> { where.not(executed_at: nil) }
|
||||
end
|
||||
|
||||
@@ -2,7 +2,8 @@ class Dashboard::ExecutedAction < ActiveRecord::Base
|
||||
belongs_to :proposal
|
||||
belongs_to :action, class_name: "Dashboard::Action"
|
||||
|
||||
has_many :administrator_tasks, as: :source, dependent: :destroy, class_name: "Dashboard::AdministratorTask"
|
||||
has_many :administrator_tasks, as: :source, dependent: :destroy,
|
||||
class_name: "Dashboard::AdministratorTask"
|
||||
|
||||
validates :proposal, presence: true, uniqueness: { scope: :action }
|
||||
validates :action, presence: true
|
||||
|
||||
@@ -42,9 +42,9 @@ class Poll < ActiveRecord::Base
|
||||
scope :sort_for_list, -> { order(:geozone_restricted, :starts_at, :name) }
|
||||
|
||||
def self.overlaping_with(poll)
|
||||
where("? < ends_at and ? >= starts_at", poll.starts_at.beginning_of_day, poll.ends_at.end_of_day)
|
||||
.where.not(id: poll.id)
|
||||
.where(related: poll.related)
|
||||
where("? < ends_at and ? >= starts_at", poll.starts_at.beginning_of_day,
|
||||
poll.ends_at.end_of_day).where.not(id: poll.id)
|
||||
.where(related: poll.related)
|
||||
end
|
||||
|
||||
def title
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
<%= image_tag "default_mailing.jpg", style: "width: 100%; box-shadow: -16px 61px 49px -19px rgba(0,0,0,0.1);" %>
|
||||
<% end %>
|
||||
|
||||
<p style="padding: 0 50px; font-size:32px; text-align: left; line-height:43px; color: #515151;"><%= t("dashboard.mailer.forward.hi")%></p>
|
||||
<p style="padding: 0 50px; font-size:32px; text-align: left; line-height:43px; color: #515151;"><%= t("dashboard.mailer.forward.introduction", org: setting['org_name']) %></p>
|
||||
<p style="padding: 0 50px; font-size:32px; text-align: left; line-height:43px; color: #515151;"><%= t("dashboard.mailer.forward.hi") %></p>
|
||||
<p style="padding: 0 50px; font-size:32px; text-align: left; line-height:43px; color: #515151;"><%= t("dashboard.mailer.forward.introduction", org: setting["org_name"]) %></p>
|
||||
<p style="padding: 0 50px; font-size:32px; text-align: left; line-height:43px; color: #515151;"><%= t("dashboard.mailer.forward.support") %></p>
|
||||
|
||||
<table style="width: 100%;">
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<% if proposal.image.present? %>
|
||||
<div class="overflow-image" style="background-image: url(<%= asset_url proposal.image.attachment.url(:large) %>);"></div>
|
||||
<% else %>
|
||||
<div class="overflow-image" style="background-image: url(<%= asset_url "default_mailing.jpg"%>);"></div>
|
||||
<div class="overflow-image" style="background-image: url(<%= asset_url "default_mailing.jpg" %>);"></div>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="poster-content">
|
||||
@@ -36,5 +36,5 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= render 'poster_options' %>
|
||||
<%= render "poster_options" %>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<h2 class="title"><%= t("dashboard.recommended_actions.title") %></h3>
|
||||
<h2 class="title"><%= t("dashboard.recommended_actions.title") %></h2>
|
||||
|
||||
<%= render 'recommended_actions_by_status', status: 'pending', actions: @pending_actions, toggle: true %>
|
||||
<%= render 'recommended_actions_by_status', status: 'done', actions: @done_actions, toggle: true %>
|
||||
<%= render "recommended_actions_by_status", status: "pending", actions: @pending_actions, toggle: true %>
|
||||
<%= render "recommended_actions_by_status", status: "done", actions: @done_actions, toggle: true %>
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
<div class="sidebar-divider"></div>
|
||||
<p class="sidebar-title"><%= t("shared.follow") %></p>
|
||||
|
||||
<%= render "follows/follow_button", follow: find_or_build_follow(current_user, @proposal) %>
|
||||
<%= render "follows/follow_button", follow: find_or_build_follow(current_user, @proposal) %>
|
||||
<% end %>
|
||||
|
||||
<%= render "communities/access_button", community: @proposal.community %>
|
||||
|
||||
@@ -239,7 +239,7 @@ namespace :admin do
|
||||
resources :feeds, only: [:update]
|
||||
end
|
||||
|
||||
namespace :dashboard do
|
||||
namespace :dashboard do
|
||||
resources :actions, only: [:index, :new, :create, :edit, :update, :destroy]
|
||||
resources :administrator_tasks, only: [:index, :edit, :update]
|
||||
end
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
resources :proposals do
|
||||
resource :dashboard, only: [:show], controller: 'dashboard' do
|
||||
resource :dashboard, only: [:show], controller: "dashboard" do
|
||||
collection do
|
||||
patch :publish
|
||||
get :progress
|
||||
@@ -7,14 +7,14 @@ resources :proposals do
|
||||
get :recommended_actions
|
||||
end
|
||||
|
||||
resources :resources, only: [:index], controller: 'dashboard/resources'
|
||||
resources :achievements, only: [:index], controller: 'dashboard/achievements'
|
||||
resources :successful_supports, only: [:index], controller: 'dashboard/successful_supports'
|
||||
resources :supports, only: [:index], controller: 'dashboard/supports'
|
||||
resources :polls, except: [:show, :destroy], controller: 'dashboard/polls'
|
||||
resources :mailing, only: [:index, :new, :create], controller: 'dashboard/mailing'
|
||||
resources :poster, only: [:index, :new], controller: 'dashboard/poster'
|
||||
resources :actions, only: [], controller: 'dashboard/actions' do
|
||||
resources :resources, only: [:index], controller: "dashboard/resources"
|
||||
resources :achievements, only: [:index], controller: "dashboard/achievements"
|
||||
resources :successful_supports, only: [:index], controller: "dashboard/successful_supports"
|
||||
resources :supports, only: [:index], controller: "dashboard/supports"
|
||||
resources :polls, except: [:show, :destroy], controller: "dashboard/polls"
|
||||
resources :mailing, only: [:index, :new, :create], controller: "dashboard/mailing"
|
||||
resources :poster, only: [:index, :new], controller: "dashboard/poster"
|
||||
resources :actions, only: [], controller: "dashboard/actions" do
|
||||
member do
|
||||
post :execute
|
||||
get :new_request
|
||||
|
||||
@@ -48,6 +48,7 @@ section "Creating Archived Proposals" do
|
||||
5.times do
|
||||
author = User.all.sample
|
||||
description = "<p>#{Faker::Lorem.paragraphs.join('</p><p>')}</p>"
|
||||
months_to_archive_proposals = Setting["months_to_archive_proposals"]
|
||||
proposal = Proposal.create!(author: author,
|
||||
title: Faker::Lorem.sentence(3).truncate(60),
|
||||
question: Faker::Lorem.sentence(3) + "?",
|
||||
@@ -59,8 +60,8 @@ section "Creating Archived Proposals" do
|
||||
geozone: Geozone.all.sample,
|
||||
skip_map: "1",
|
||||
terms_of_service: "1",
|
||||
created_at: Setting["months_to_archive_proposals"].to_i.months.ago,
|
||||
published_at: Setting["months_to_archive_proposals"].to_i.months.ago)
|
||||
created_at: months_to_archive_proposals.to_i.months.ago,
|
||||
published_at: months_to_archive_proposals.to_i.months.ago)
|
||||
add_image_to proposal
|
||||
end
|
||||
end
|
||||
@@ -114,6 +115,5 @@ section "Creating proposal notifications" do
|
||||
body: "Proposal notification body #{i}",
|
||||
author: User.all.sample,
|
||||
proposal: Proposal.all.sample)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,9 +7,11 @@ namespace :dashboards do
|
||||
|
||||
if new_actions_ids.present?
|
||||
if proposal.published?
|
||||
Dashboard::Mailer.new_actions_notification_rake_published(proposal, new_actions_ids).deliver_later
|
||||
Dashboard::Mailer.new_actions_notification_rake_published(proposal,
|
||||
new_actions_ids).deliver_later
|
||||
else
|
||||
Dashboard::Mailer.new_actions_notification_rake_created(proposal, new_actions_ids).deliver_later
|
||||
Dashboard::Mailer.new_actions_notification_rake_created(proposal,
|
||||
new_actions_ids).deliver_later
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -18,7 +20,11 @@ namespace :dashboards do
|
||||
desc "Basic templates with Dashboard::Actions recommended"
|
||||
task create_basic_dashboard_actions_template: :environment do
|
||||
Dashboard::Action.create(title: "Kit de difusión",
|
||||
description: "<p>Aquí tienes un manual para ayudarte a comunicar tu propuesta y que tengas el mayor éxito posible. Es fundamental que estés detrás de ella impulsándola. Este documento te ayudará a tener una estrategia en tu comunicación. Puedes descargártelo en pdf, como también leerlo online. </p>\r\n",
|
||||
description: "<p>Aquí tienes un manual para ayudarte a comunicar tu "\
|
||||
"propuesta y que tengas el mayor éxito posible. Es fundamental que "\
|
||||
"estés detrás de ella impulsándola. Este documento te ayudará a "\
|
||||
"tener una estrategia en tu comunicación. Puedes descargártelo en "\
|
||||
"pdf, como también leerlo online.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 1,
|
||||
required_supports: 0,
|
||||
@@ -28,7 +34,9 @@ namespace :dashboards do
|
||||
short_description: "Manual para diseñar tu estrategia de comunicación",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Habla primero con familiares y amigos",
|
||||
description: "<p>Cuéntales tu propuesta, pídeles consejo y, una vez la hayas publicado, pídeles que la compartan en sus redes sociales. Ellos serán los primeros en apoyar tu campaña.</p>\r\n",
|
||||
description: "<p>Cuéntales tu propuesta, pídeles consejo y, una vez "\
|
||||
"la hayas publicado, pídeles que la compartan en sus redes sociales. "\
|
||||
"Ellos serán los primeros en apoyar tu campaña.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
@@ -38,7 +46,17 @@ namespace :dashboards do
|
||||
short_description: "Ellos serán tu primer y más importante apoyo",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Haz que tu campaña tenga la mejor imagen",
|
||||
description: "<p>¡Añadir una fotografía o vídeo a tu propuesta consigue hasta 6 veces más apoyos que las propuestas que no la tienen! Es fundamental que escojas la mejor fotografía posible y, si las personas implicadas en la propuesta aparecen en ella, ¡mucho mejor! Además, aquí te dejamos algunos consejos más técnicos para que apliques a la elección de la imagen de tu propuesta. Síguelos y verás el resultado:<br />\r\n- Fotos de animales y personas, siempre funcionan mejor.<br />\r\n- Las fotos grandes siempre quedan mejor, pero ¡ojo, la imagen no puede exceder 1mb de peso máximo!<br />\r\n- Haz que tu foto sea apta para todos los públicos y no contenga contenido explícito.</p>\r\n",
|
||||
description: "<p>¡Añadir una fotografía o vídeo a tu propuesta "\
|
||||
"consigue hasta 6 veces más apoyos que las propuestas que no la "\
|
||||
"tienen! Es fundamental que escojas la mejor fotografía posible y, "\
|
||||
"si las personas implicadas en la propuesta aparecen en ella, "\
|
||||
"¡mucho mejor! Además, aquí te dejamos algunos consejos más técnicos "\
|
||||
"para que apliques a la elección de la imagen de tu propuesta. "\
|
||||
"Síguelos y verás el resultado:<br />\r\n- Fotos de animales y "\
|
||||
"personas, siempre funcionan mejor.<br />\r\n- Las fotos grandes "\
|
||||
"siempre quedan mejor, pero ¡ojo, la imagen no puede exceder 1Mb de "\
|
||||
"peso máximo!<br />\r\n- Haz que tu foto sea apta para todos los "\
|
||||
"públicos y no contenga contenido explícito.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
@@ -48,17 +66,30 @@ namespace :dashboards do
|
||||
short_description: "",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Elige un título corto, potente y llamativo",
|
||||
description: "<p>Es importante ir al grano. Haz partícipes a todos de tu propuesta. Céntrate en la solución, en el beneficio o en aquello que se necesita resolver. Ubica tu propuesta ciudadana. Aquí te dejamos algunos ejemplos para que adaptes al título de tu propuesta:<br />\r\n- 'Queremos una Plaza de Olavide limpia y habitable'<br />\r\n- 'No al cierre del mercado de abastos de Leganés'<br />\r\n- 'No más basura en nuestro barrio de La Latina'<br />\r\n- 'Colocar más contenedores de vidrio en Argüelles'<br />\r\n- 'Arreglen la estación para bicicletas de Legazpi'</p>\r\n",
|
||||
description: "<p>Es importante ir al grano. Haz partícipes a todos "\
|
||||
"de tu propuesta. Céntrate en la solución, en el beneficio o en "\
|
||||
"aquello que se necesita resolver. Ubica tu propuesta ciudadana. "\
|
||||
"Aquí te dejamos algunos ejemplos para que adaptes al título de tu "\
|
||||
"propuesta:<br />\r\n- 'Queremos una Plaza de Olavide limpia y "\
|
||||
"habitable'<br />\r\n- 'No al cierre del mercado de abastos de "\
|
||||
"Leganés'<br />\r\n- 'No más basura en nuestro barrio de La Latina' "\
|
||||
"<br />\r\n- 'Colocar más contenedores de vidrio en Argüelles' "\
|
||||
"<br />\r\n- 'Arreglen la estación para bicicletas de Legazpi "\
|
||||
"'</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
order: 1,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Sé conciso y directo para que tu propuesta se entienda al instante",
|
||||
short_description: "Sé conciso y directo para que tu propuesta "\
|
||||
"se entienda al instante",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Expresa siempre tu agradecimiento",
|
||||
description: "<p>Tanto si te brindan su apoyo como si no, da las gracias siempre. Además de mostrar tu agradecimiento, servirá para crear una comunicación nueva que podría atraer a otras personas hasta tu propuesta y de este modo, conseguir nuevos apoyos.</p>\r\n",
|
||||
description: "<p>Tanto si te brindan su apoyo como si no, da las "\
|
||||
"gracias siempre. Además de mostrar tu agradecimiento, servirá para "\
|
||||
"crear una comunicación nueva que podría atraer a otras personas "\
|
||||
"hasta tu propuesta y de este modo, conseguir nuevos apoyos.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 3,
|
||||
required_supports: 0,
|
||||
@@ -68,7 +99,15 @@ namespace :dashboards do
|
||||
short_description: "Es una buena manera de lograr apoyos en el futuro",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Cuéntaselo a tus amigos en persona",
|
||||
description: "<p>Antes de publicar, haz un evento o plan con tu gente, amigos, familiares, compañeros de trabajo... Reúne a todo el mundo alrededor de unas cervecitas y una buena conversación, cuéntales tu propuesta e invítales a que la mejoren y participen de ella. Esta idea es fácilmente combinable con la creación de tus encuestas previas a la publicación de la propuesta. Puedes desarrollar las encuestas para estos encuentros y debatir las conclusiones; o bien que las respondan in situ, lo que prefieras.</p>\r\n",
|
||||
description: "<p>Antes de publicar, haz un evento o plan con tu "\
|
||||
"gente, amigos, familiares, compañeros de trabajo... Reúne a todo "\
|
||||
"el mundo alrededor de unas cervecitas y una buena conversación, "\
|
||||
"cuéntales tu propuesta e invítales a que la mejoren y participen de "\
|
||||
"ella. Esta idea es fácilmente combinable con la creación de tus "\
|
||||
"encuestas previas a la publicación de la propuesta. Puedes "\
|
||||
"desarrollar las encuestas para estos encuentros y debatir las "\
|
||||
"conclusiones; o bien que las respondan in situ, lo que "\
|
||||
"prefieras.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 4,
|
||||
required_supports: 0,
|
||||
@@ -78,7 +117,15 @@ namespace :dashboards do
|
||||
short_description: "Crea un encuentro para compartir tu propuesta.",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Crea una encuesta personalizada",
|
||||
description: "<p>Las encuestas sirven para resolver dudas, pedir opinión, mejorar tu propuesta y también para crear una comunidad en torno a la cual hacer crecer tu propuesta en apoyos, una vez la hayas afinado y mejorado y decidas hacerla pública para todos ellos.<br />\r\n<br />\r\nEsta idea es fácilmente combinable con la organización de un encuentro o evento en el que les cuentes a todos tus contactos, amigos y familiares cuál es tu propuesta y el por qué de la importancia de su apoyo para lograr tus objetivos.</p>\r\n",
|
||||
description: "<p>Las encuestas sirven para resolver dudas, pedir "\
|
||||
"opinión, mejorar tu propuesta y también para crear una comunidad "\
|
||||
"en torno a la cual hacer crecer tu propuesta en apoyos, una vez la "\
|
||||
"hayas afinado y mejorado y decidas hacerla pública para todos "\
|
||||
"ellos.<br />\r\n<br />\r\nEsta idea es fácilmente combinable con "\
|
||||
"la organización de un encuentro o evento en el que les cuentes a "\
|
||||
"todos tus contactos, amigos y familiares cuál es tu propuesta y el "\
|
||||
"por qué de la importancia de su apoyo para lograr tus "\
|
||||
"objetivos.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 5,
|
||||
required_supports: 0,
|
||||
@@ -88,17 +135,32 @@ namespace :dashboards do
|
||||
short_description: "Pregunta lo que quieras sobre tu propuesta",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Suma en tu propósito a los negocios de tu barrio",
|
||||
description: "<p>Quizá tu propuesta influya directamente en los negocios de tu barrio e incluso pueda ayudar a mejorar su situación y tú, seguro que conoces a esas personas que los dirigen o regentan, ¿verdad? Contacta con ellos y cuéntales todo para que te ayuden a lograr votos. ¡Ellos, como tú, también ganarán!</p>\r\n",
|
||||
description: "<p>Quizá tu propuesta influya directamente en los "\
|
||||
"negocios de tu barrio e incluso pueda ayudar a mejorar su situación "\
|
||||
"y tú, seguro que conoces a esas personas que los dirigen o "\
|
||||
"regentan, ¿verdad? Contacta con ellos y cuéntales todo para que "\
|
||||
"te ayuden a lograr votos. ¡Ellos, como tú, también ganarán!</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 7,
|
||||
required_supports: 0,
|
||||
order: 10,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "¿Has pensado en hablar con los bares o comercios que más visitas?",
|
||||
short_description: "¿Has pensado en hablar con los bares o "\
|
||||
"comercios que más visitas?",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Incluye hashtags en tus publicaciones",
|
||||
description: "<p>El hashtag es una herramienta indispensable para aumentar la participación y tus apoyos. Se utiliza principalmente en Twitter, pero Facebook, Instagram, Pinterest o Google+ también incorporan esta opción. Es muy recomendable que al publicar, siempre utilices los mismos hashtags en tus publicaciones para, sobre ellos, crear tu propio contenido. Haz una búsqueda o pide ayuda sobre cuáles utilizar y que tengan que ver con tu propuesta en concreto. Nosotros te dejamos aquí algunos ejemplos o ideas de hashtags que tienen que ver con diversos ámbitos sociales sobre los que podría ir tu propuesta. Pero lo ideal es que utilices otros más acordes a la temática de la tuya propia.<br />\r\n- #madrid_detodos #madridtoday #lovemadrid #madridlimpio #madridsinfiltros #madridverde #lavapiesenpositivo<br />\r\n </p>\r\n",
|
||||
description: "<p>El hashtag es una herramienta indispensable para "\
|
||||
"aumentar la participación y tus apoyos. Se utiliza principalmente "\
|
||||
"en Twitter, pero Facebook, Instagram, Pinterest o Google+ también "\
|
||||
"incorporan esta opción. Es muy recomendable que al publicar, "\
|
||||
"siempre utilices los mismos hashtags en tus publicaciones para, "\
|
||||
"sobre ellos, crear tu propio contenido. Haz una búsqueda o pide "\
|
||||
"ayuda sobre cuáles utilizar y que tengan que ver con tu propuesta "\
|
||||
"en concreto. Nosotros te dejamos aquí algunos ejemplos o ideas de "\
|
||||
"hashtags que tienen que ver con diversos ámbitos sociales sobre los "\
|
||||
"que podría ir tu propuesta. Pero lo ideal es que utilices otros más "\
|
||||
"acordes a la temática de la tuya propia.<br /></p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 6,
|
||||
required_supports: 0,
|
||||
@@ -108,27 +170,44 @@ namespace :dashboards do
|
||||
short_description: "Utilizar hashtags te permitirá llegar a más gente",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Suma en tu propósito a ONGs o centros sociales de tu barrio",
|
||||
description: "<p>Quizá tu propuesta influya directamente en la mejora de la calidad de vida de las personas que vivie en tu barrio o localidad, incluso aquellas con menos recursos y los colectivos más desfavorecidos o en riesgo de exclusión social. Contacta con las ONG's y Centros Sociales cercanos a ti y cuéntales tu propuesta para que te ayuden a lograr votos. ¡Estarán encantados de colaborar!</p>\r\n",
|
||||
description: "<p>Quizá tu propuesta influya directamente en la "\
|
||||
"mejora de la calidad de vida de las personas que vivie en tu barrio "\
|
||||
"o localidad, incluso aquellas con menos recursos y los colectivos "\
|
||||
"más desfavorecidos o en riesgo de exclusión social. Contacta con "\
|
||||
"las ONG's y Centros Sociales cercanos a ti y cuéntales tu "\
|
||||
"propuesta para que te ayuden a lograr votos. ¡Estarán encantados "\
|
||||
"de colaborar!</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 7,
|
||||
required_supports: 0,
|
||||
order: 11,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Cuéntales tu propuesta a todos los que pueda interesarles",
|
||||
short_description: "Cuéntales tu propuesta a todos los que pueda "\
|
||||
"interesarles",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "¿Conoces a algún influencer?",
|
||||
description: "<p>Un 'influencer' es una persona que cuenta con numerosos seguidores en redes sociales. Por ello, si en tu entorno cercano conoces a alguien que lo sea o que utilice activamente sus perfiles sociales y obtenga mucha o cierta repercusión en ellos, es una gran oportunidad para contarle acerca de tu propuesta y pedirle que te ayude a difundirla compartiéndola en sus redes sociales.</p>\r\n",
|
||||
description: "<p>Un 'influencer' es una persona que cuenta con "\
|
||||
"numerosos seguidores en redes sociales. Por ello, si en tu entorno "\
|
||||
"cercano conoces a alguien que lo sea o que utilice activamente sus "\
|
||||
"perfiles sociales y obtenga mucha o cierta repercusión en ellos, "\
|
||||
"es una gran oportunidad para contarle acerca de tu propuesta y "\
|
||||
"pedirle que te ayude a difundirla compartiéndola en sus redes "\
|
||||
"sociales.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 8,
|
||||
required_supports: 0,
|
||||
order: 12,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Cuéntale tu propuesta y consigue que él y sus seguidores te apoyen",
|
||||
short_description: "Cuéntale tu propuesta y consigue que él y sus "\
|
||||
"seguidores te apoyen",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Pide apoyos en persona",
|
||||
description: "<p>Aunque tenemos medios a nuestro alcance capaces de llegar en un instante a cientos y miles de personas, nada funciona mejor que pedir el apoyo en persona. ¡Es 34 veces más eficaz que por email!</p>\r\n",
|
||||
description: "<p>Aunque tenemos medios a nuestro alcance capaces de "\
|
||||
"llegar en un instante a cientos y miles de personas, nada funciona "\
|
||||
"mejor que pedir el apoyo en persona. ¡Es 34 veces más eficaz que "\
|
||||
"por email!</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 1,
|
||||
required_supports: 0,
|
||||
@@ -138,7 +217,15 @@ namespace :dashboards do
|
||||
short_description: "¡Es 34 veces más eficaz que por email!",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Prepara tus mensajes en redes sociales",
|
||||
description: "<p>Crea un pequeño calendario de publicaciones semanales en Facebook y/o Twitter (tres a la semana es suficiente durante los primeros meses). Utiliza imágenes en las que aparezcas tú mismo solicitando el apoyo o imágenes llamativas sobre el proyecto. Y sobre todo: utiliza un lenguaje sencillo, directo a la hora de pedir el apoyo y siempre con mensajes personalizados si vas a dirigirte a tus contactos de manera privada. Es importante que se sientan partícipes y no uno más en tu necesidad de conseguir apoyos.</p>\r\n",
|
||||
description: "<p>Crea un pequeño calendario de publicaciones "\
|
||||
"semanales en Facebook y/o Twitter (tres a la semana es suficiente "\
|
||||
"durante los primeros meses). Utiliza imágenes en las que aparezcas "\
|
||||
"tú mismo solicitando el apoyo o imágenes llamativas sobre el "\
|
||||
"proyecto. Y sobre todo: utiliza un lenguaje sencillo, directo a "\
|
||||
"la hora de pedir el apoyo y siempre con mensajes personalizados "\
|
||||
"si vas a dirigirte a tus contactos de manera privada. Es "\
|
||||
"importante que se sientan partícipes y no uno más en tu "\
|
||||
"necesidad de conseguir apoyos.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 2,
|
||||
required_supports: 0,
|
||||
@@ -148,67 +235,144 @@ namespace :dashboards do
|
||||
short_description: "Es muy importante saber qué vas a decir y cómo",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Informa de tus planes antes de la publicación",
|
||||
description: "<p>No es necesario que debas tener creada totalmente o publicada tu propuesta para comenzar a hablar de ella. De hecho, te recomendamos que hagas publicaciones en tus redes sociales y hables con tus amigos y familiares de ella antes de que vea la luz. Es lo que se llama una campaña 'teaser' y sirve para crear expectación sobre algo que va a llegar muy pronto.<br />\r\n<br />\r\nPara ello te recomendamos que incluyas mensajes de este tipo en tus publicaciones en redes sociales. De hecho, puedes copiar estos textos y utilizarlos si lo deseas:<br />\r\n- 'Muy pronto crearé mi propia propuesta ciudadana para mejorar nuestra ciudad de Madrid, y necesitaré vuestro apoyo más que nunca. Os seguiré informando desde aquí. Muchas gracias a todos'<br />\r\n- Este es un mensaje para todos aquellos a los que les importa su ciudad, su barrio y nuestro futuro. Quiero mejorar Madrid con una propuesta que muy pronto os haré llegar a todos para que juntos, logremos que se lleve a cabo. ¡Gracias a todos!</p>\r\n",
|
||||
description: "<p>No es necesario que debas tener creada totalmente "\
|
||||
"o publicada tu propuesta para comenzar a hablar de ella. De hecho, "\
|
||||
"te recomendamos que hagas publicaciones en tus redes sociales y "\
|
||||
"hables con tus amigos y familiares de ella antes de que vea la "\
|
||||
"luz. Es lo que se llama una campaña 'teaser' y sirve para crear "\
|
||||
"expectación sobre algo que va a llegar muy pronto.<br />\r\n "\
|
||||
"<br />\r\nPara ello te recomendamos que incluyas mensajes de este "\
|
||||
"tipo en tus publicaciones en redes sociales. De hecho, puedes "\
|
||||
"copiar estos textos y utilizarlos si lo deseas:<br />\r\n- 'Muy "\
|
||||
"pronto crearé mi propia propuesta ciudadana para mejorar nuestra "\
|
||||
"ciudad de Madrid, y necesitaré vuestro apoyo más que nunca. Os "\
|
||||
"seguiré informando desde aquí. Muchas gracias a todos'<br />\r\n- "\
|
||||
"Este es un mensaje para todos aquellos a los que les importa "\
|
||||
"su ciudad, su barrio y nuestro futuro. Quiero mejorar Madrid con "\
|
||||
"una propuesta que muy pronto os haré llegar a todos para que "\
|
||||
"juntos, logremos que se lleve a cabo. ¡Gracias a todos!</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 6,
|
||||
required_supports: 0,
|
||||
order: 8,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Todos en redes sociales deben saber que pronto crearás tu propuesta. ",
|
||||
short_description: "Todos en redes sociales deben saber que "\
|
||||
"pronto crearás tu propuesta.",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Comparte tu propuesta en comunidades de facebook",
|
||||
description: "<p>Es fundamental que busques el apoyo que necesitas en todas partes. Las comunidades y grupos (privados o abiertos) de Facebook en Madrid, también son un buen lugar del que recabar nuevos apoyos y aliados en tu camino hacia la meta.<br />\r\n<br />\r\nPara ello, busca y selecciona bien aquellas comunidades y grupos ya creados en Facebook que son más afines a la naturaleza de tu propuesta. Por ejemplo si tu propuesta versa sobre 'mejorar un parque público', seguramente encuentres el apoyo que necesitas en ciclistas, grupos de running, colectivos y personas cercanas al parque, etc. Solicita unirte a ellos, y una vez estés dentro, publica allí tu propuesta informándoles de ella y pidiéndoles respetuosamente, su apoyo en la mejora de vuestra ciudad. Ten en cuenta siempre cómo enfocar tu mensaje para que sea lo más acorde al grupo en el que publicas y a también a sus intereses. Piensa que al final se trata de obtener apoyos de personas que no conoces, y ella, también debe entender cuál es el beneficio que obtiene por ayudarte. Y desde luego, en ningún caso, debe percibir tu petición como 'spam' o intrusiva, así que ten tacto al pedir tus apoyos.</p>\r\n",
|
||||
description: "<p>Es fundamental que busques el apoyo que "\
|
||||
"necesitas en todas partes. Las comunidades y grupos (privados "\
|
||||
"o abiertos) de Facebook en Madrid, también son un buen lugar del "\
|
||||
"que recabar nuevos apoyos y aliados en tu camino hacia la "\
|
||||
"meta.<br />\r\n<br />\r\nPara ello, busca y selecciona bien "\
|
||||
"aquellas comunidades y grupos ya creados en Facebook que son más "\
|
||||
"afines a la naturaleza de tu propuesta. Por ejemplo si tu "\
|
||||
"propuesta versa sobre 'mejorar un parque público', seguramente "\
|
||||
"encuentres el apoyo que necesitas en ciclistas, grupos de "\
|
||||
"running, colectivos y personas cercanas al parque, etc. "\
|
||||
"Solicita unirte a ellos, y una vez estés dentro, publica allí tu "\
|
||||
"propuesta informándoles de ella y pidiéndoles respetuosamente, "\
|
||||
"su apoyo en la mejora de vuestra ciudad. Ten en cuenta siempre "\
|
||||
"cómo enfocar tu mensaje para que sea lo más acorde al grupo en el "\
|
||||
"que publicas y a también a sus intereses. Piensa que al final se "\
|
||||
"trata de obtener apoyos de personas que no conoces, y ella, "\
|
||||
"también debe entender cuál es el beneficio que obtiene por "\
|
||||
"ayudarte. Y desde luego, en ningún caso, debe percibir tu "\
|
||||
"petición como 'spam' o intrusiva, así que ten tacto al pedir "\
|
||||
"tus apoyos.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 9,
|
||||
required_supports: 0,
|
||||
order: 13,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "¿Sabes a cuántas personas podrías llegar con estos grupos?",
|
||||
short_description: "¿Sabes a cuántas personas podrías llegar "\
|
||||
"con estos grupos?",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Analiza con detenimiento otras propuestas",
|
||||
description: "<p>Parece una obviedad pero asegúrate de hacerlo. Antes de que tu propuesta vea la luz, fíjate en cómo lo han hecho otros ciudadanos y ciudadanas a la hora de crear la suya: fotografía, mensajes, título... Habrá algunas que te gusten más y menos, mejor o peor expuestas; tú debes analizarlas y quedarte con lo mejor de cada una para implantarlo a la tuya propia.<br />\r\n<br />\r\nAquí te dejamos estos ejemplos de las más destacadas hasta el momento para que veas cómo lo han hecho. ¡Si ellos han conseguido los apoyos necesarios o están a punto, tú también puedes!<br />\r\n<br />\r\nHaz click aquí: https://decide.madrid.es/proposals/20657-moratoria-turistica-en-el-centro-de-madrid<br />\r\nhttps://decide.madrid.es/proposals/9-billete-unico-para-el-transporte-publico para ver las propuestas.<br />\r\n<br />\r\n </p>\r\n",
|
||||
description: "<p>Parece una obviedad pero asegúrate de hacerlo. "\
|
||||
"Antes de que tu propuesta vea la luz, fíjate en cómo lo han hecho "\
|
||||
"otros ciudadanos y ciudadanas a la hora de crear la suya: "\
|
||||
"fotografía, mensajes, título... Habrá algunas que te gusten más "\
|
||||
"y menos, mejor o peor expuestas; tú debes analizarlas y quedarte "\
|
||||
"con lo mejor de cada una para implantarlo a la tuya propia.<br /> "\
|
||||
"\r\n<br />\r\nAquí te dejamos estos ejemplos de las más destacadas "\
|
||||
"hasta el momento para que veas cómo lo han hecho. ¡Si ellos han "\
|
||||
"conseguido los apoyos necesarios o están a punto, tú también puedes!",
|
||||
request_to_administrators: false,
|
||||
day_offset: 10,
|
||||
required_supports: 0,
|
||||
order: 14,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Antes de publicar tu propuesta, mira cómo lo han hecho otros",
|
||||
short_description: "Antes de publicar tu propuesta, mira cómo "\
|
||||
"lo han hecho otros",
|
||||
published_proposal: false)
|
||||
Dashboard::Action.create(title: "Utiliza whatsapp para difundir ",
|
||||
description: "<p>¡Tus amigos, familiares, tu entorno cercano te apoyarán para que tu propuesta se lleve a cabo. ¡No olvides copiar el enlace de tu propuesta e incluirlo en tu mensaje para que puedan ir directamente a apoyarte! Compártelo en todos tus grupos, pégalo a todos tus contactos de manera personal y ¡obtendrás resultados más rápidamente!</p>\r\n",
|
||||
description: "<p>¡Tus amigos, familiares, tu entorno cercano te "\
|
||||
"apoyarán para que tu propuesta se lleve a cabo. ¡No olvides copiar "\
|
||||
"el enlace de tu propuesta e incluirlo en tu mensaje para que "\
|
||||
"puedan ir directamente a apoyarte! Compártelo en todos tus grupos "\
|
||||
", pégalo a todos tus contactos de manera personal y "\
|
||||
"¡obtendrás resultados más rápidamente!</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
order: 17,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Whatsapp o su equivalente Telegram son grandes herramientas para conseguir apoyos instantáneos.",
|
||||
short_description: "Whatsapp o su equivalente Telegram son grandes "\
|
||||
"herramientas para conseguir apoyos instantáneos.",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Utiliza tus redes sociales",
|
||||
description: "<p>En la fase de precampaña ya te invitamos a utilizar tus redes sociales, ¡son el mejor medio para llegar al máximo de personas! Además, también te hemos dado un KIT de imágenes para que puedas comunicar tu propuesta. Ahora además, te aconsejamos que, directamente, copies y pegues el enlace de tu propuesta en tus perfiles sociales para que la gente pueda acceder y apoyarte.</p>\r\n",
|
||||
description: "<p>En la fase de precampaña ya te invitamos a "\
|
||||
"utilizar tus redes sociales, ¡son el mejor medio para llegar al "\
|
||||
"máximo de personas! Además, también te hemos dado un KIT de "\
|
||||
"imágenes para que puedas comunicar tu propuesta. Ahora además, "\
|
||||
"te aconsejamos que, directamente, copies y pegues el enlace de tu "\
|
||||
"propuesta en tus perfiles sociales para que la gente pueda "\
|
||||
"acceder y apoyarte.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
order: 16,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Copia y pega el enlace de tu propuesta en tus perfiles sociales.",
|
||||
short_description: "Copia y pega el enlace de tu propuesta en "\
|
||||
"tus perfiles sociales.",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Continúa pidiendo apoyo a nuevos embajadores de tu propuesta",
|
||||
description: "<p>Tu propuesta para mejorar la ciudad puede mejorar también la vida de muchas personas incluidas aquellas que regentan bares, fruterías, peluquerías, o que ayudan a otros como ONG's, Centros Sociales, Asociaciones de Vecinos... Piensa a quién podría interesarle apoyar tu propuesta, cuéntale todo con detalle y ¡verás cómo logras muchos más apoyos de los que esperabas!</p>\r\n",
|
||||
description: "<p>Tu propuesta para mejorar la ciudad puede mejorar "\
|
||||
"también la vida de muchas personas incluidas aquellas que "\
|
||||
"regentan bares, fruterías, peluquerías, o que ayudan a otros "\
|
||||
"como ONG's, Centros Sociales, Asociaciones de Vecinos... Piensa a "\
|
||||
"quién podría interesarle apoyar tu propuesta, cuéntale todo con "\
|
||||
"detalle y ¡verás cómo logras muchos más apoyos de los que "\
|
||||
"esperabas!</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 1,
|
||||
required_supports: 0,
|
||||
order: 18,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Comercios, negocios locales, Centros Sociales, Colectivos...",
|
||||
short_description: "Comercios, negocios locales, Centros Sociales, "\
|
||||
"Colectivos...",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Pide que te dejen colocar carteles",
|
||||
description: "<p>Seguro que te llevas genial con esos dueños de negocios, comercios, tiendas, centros sociales y cívicos, asociaciones... de tu barrio. ¡Pídeles que te permitan colocar en sus instalaciones y locales algún cartel informando de tu propuesta para que todo el que pase por allí pueda apoyarte y contárselo a otras personas!<br />\r\n<br />\r\nPara ello, puedes decírselo personalmente o recurrir a los nuevos recursos. Cuando logres los apoyos necesarios (si no los tienes ya), verás que a tu disposición hemos puesto un recurso 'Póster' para que puedas descargarlo e imprimirlo o imprimirlo directamente desde esta herramienta. Una vez lo tengas, pide permiso, y pégalo en distintos lugares para que todo el que pase por allí puedan saber de tu propuesta y entrar en la plataforma para apoyarte.<br />\r\n </p>\r\n",
|
||||
description: "<p>Seguro que te llevas genial con esos dueños de "\
|
||||
"negocios, comercios, tiendas, centros sociales y cívicos, "\
|
||||
"asociaciones... de tu barrio. ¡Pídeles que te permitan colocar en "\
|
||||
"sus instalaciones y locales algún cartel informando de tu propuesta "\
|
||||
"para que todo el que pase por allí pueda apoyarte y contárselo a "\
|
||||
"otras personas!<br />\r\n<br />\r\nPara ello, puedes decírselo "\
|
||||
"personalmente o recurrir a los nuevos recursos. Cuando logres los "\
|
||||
"apoyos necesarios (si no los tienes ya), verás que a tu "\
|
||||
"disposición hemos puesto un recurso 'Póster' para que puedas "\
|
||||
"descargarlo e imprimirlo o imprimirlo directamente desde esta "\
|
||||
"herramienta. Una vez lo tengas, pide permiso, y pégalo en "\
|
||||
"distintos lugares para que todo el que pase por allí puedan saber "\
|
||||
"de tu propuesta y entrar en la plataforma para apoyarte.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 1,
|
||||
required_supports: 0,
|
||||
@@ -218,17 +382,33 @@ namespace :dashboards do
|
||||
short_description: "¿Imaginas tu propuesta visible por todas partes?",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Aplica las acciones que tienes pendientes",
|
||||
description: "<p>Es hora de llevar un paso más allá las acciones que te aconsejamos mientras tu propuesta estaba en borrador. Si no las conoces es el momento de que las repases con atención. El primer día de campaña es muy importante. Tu propuesta, por estar entre las nuevas publicadas, tiene más atención en la web de Decide hoy ¡Aprovecha y difunde! </p>\r\n",
|
||||
description: "<p>Es hora de llevar un paso más allá las acciones "\
|
||||
"que te aconsejamos mientras tu propuesta estaba en borrador. Si no "\
|
||||
"las conoces es el momento de que las repases con atención. El "\
|
||||
"primer día de campaña es muy importante. Tu propuesta, por estar "\
|
||||
"entre las nuevas publicadas, tiene más atención hoy ¡Aprovecha "\
|
||||
"y difunde! </p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
order: 15,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Encontrarás todas las acciones en la página de \"Acciones recomendadas\" en tu Panel de Propuesta. Recuerda utilizarlas habitualmente para lograr nuevos apoyos.",
|
||||
short_description: "Encontrarás todas las acciones en la página "\
|
||||
"de \"Acciones recomendadas\" en tu Panel de Propuesta. Recuerda "\
|
||||
"utilizarlas habitualmente para lograr nuevos apoyos.",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Pide a tu gente que comparta tu propuesta",
|
||||
description: "<p>¡Cuanta más gente conozca tu propuesta mejor! No te cortes en pedir a tus amigos, familiares y contactos que compartan ellos también tu iniciativa en sus redes sociales. ¡La unión hace la fuerza!<br />\r\n<br />\r\nEn la fase de precampaña ya te invitamos a utilizar tus redes sociales, ¡son el mejor medio para llegar al máximo de personas! Además, también te hemos dado un KIT de imágenes para que puedas comunicar tu propuesta. Y si quieres, también puedes pasarles a ellos este KIT para que publiquen las imágenes y capten apoyos para ti a través de sus perfiles personales.<br />\r\n </p>\r\n",
|
||||
description: "<p>¡Cuanta más gente conozca tu propuesta mejor! No "\
|
||||
"te cortes en pedir a tus amigos, familiares y contactos que "\
|
||||
"compartan ellos también tu iniciativa en sus redes sociales. ¡La "\
|
||||
"unión hace la fuerza!<br />\r\n<br />\r\nEn la fase de precampaña "\
|
||||
"ya te invitamos a utilizar tus redes sociales, ¡son el mejor medio "\
|
||||
"para llegar al máximo de personas! Además, también te hemos dado "\
|
||||
"un KIT de imágenes para que puedas comunicar tu propuesta. Y si "\
|
||||
"quieres, también puedes pasarles a ellos este KIT para que "\
|
||||
"publiquen las imágenes y capten apoyos para ti a través de sus "\
|
||||
"perfiles personales.<br />\r\n </p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 3,
|
||||
required_supports: 0,
|
||||
@@ -238,7 +418,17 @@ namespace :dashboards do
|
||||
short_description: "Pídeles que la muevan en sus redes sociales",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Tus vecinos son una gran comunidad para pedir apoyo",
|
||||
description: "<p>El lugar en el que vives es el sitio idóneo para pedir apoyo ya que conoces a tus vecinos y de manera personal puedes pedirles que te ayuden, es sencillo y efectivo.<br />\r\n<br />\r\nPara ello, puedes decírselo personalmente, pegar un cartel en tu portal o convocar una reunión en tu casa para los interesados. Verás que dispones del recurso 'Cartel ' para que puedas descargarlo e imprimirlo. Si es necesario ayúdales para que se hagan un usuario en la plataforma Decide. Si has convocado una reunión, y vienen a tu casa o llevas contigo un ordenador, tableta o móvil con Internet, les puede echar una mano para que se registren como nuevo usuario y te apoyen.</p>\r\n\r\n<p> </p>\r\n",
|
||||
description: "<p>El lugar en el que vives es el sitio idóneo para "\
|
||||
"pedir apoyo ya que conoces a tus vecinos y de manera personal "\
|
||||
"puedes pedirles que te ayuden, es sencillo y efectivo.<br />\r\n "\
|
||||
"<br />\r\nPara ello, puedes decírselo personalmente, pegar un "\
|
||||
"cartel en tu portal o convocar una reunión en tu casa para los "\
|
||||
"interesados. Verás que dispones del recurso 'Cartel ' para que "\
|
||||
"puedas descargarlo e imprimirlo. Si es necesario ayúdales para "\
|
||||
"que se hagan un usuario en la plataforma Decide. Si has convocado "\
|
||||
"una reunión, y vienen a tu casa o llevas contigo un ordenador, "\
|
||||
"tableta o móvil con Internet, les puede echar una mano para que se "\
|
||||
"registren como nuevo usuario y te apoyen.</p>\r\n\r\n<p> </p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 4,
|
||||
required_supports: 0,
|
||||
@@ -248,37 +438,81 @@ namespace :dashboards do
|
||||
short_description: "Deja un cartel en tu portal o convoca una reunión",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Imprime tu propuesta y repártela",
|
||||
description: "<p>Estás pidiéndoles su apoyo y es normal que ellos te pidan más información. Lo mejor es que no les reclames demasiado en primera instancia. Haz unas copias del resumen de tu propuesta, y entrégaselas a quien consideres oportuno. Las personas solemos interesarnos y apoyar aquello cuyo carácter parece serio y meditado. Por ello, te aconsejamos que redactes tu propuesta brevemente e imprimas varias copias para que todos aquellos que deseen saber más, puedan leer en sus casas y entender con tranquilidad, de qué trata realmente.</p>\r\n",
|
||||
description: "<p>Estás pidiéndoles su apoyo y es normal que ellos "\
|
||||
"te pidan más información. Lo mejor es que no les reclames demasiado "\
|
||||
"en primera instancia. Haz unas copias del resumen de tu propuesta, "\
|
||||
"y entrégaselas a quien consideres oportuno. Las personas solemos "\
|
||||
"interesarnos y apoyar aquello cuyo carácter parece serio y "\
|
||||
"meditado. Por ello, te aconsejamos que redactes tu propuesta "\
|
||||
"brevemente e imprimas varias copias para que todos aquellos que "\
|
||||
"deseen saber más, puedan leer en sus casas y entender con "\
|
||||
"tranquilidad, de qué trata realmente.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 2,
|
||||
required_supports: 0,
|
||||
order: 20,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "La gente confía más cuando tiene información suficiente",
|
||||
short_description: "La gente confía más cuando tiene información "\
|
||||
"suficiente",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Crea tarjetas de visita adaptándolas para difundir tu propuesta",
|
||||
description: "<p>¿Sabes cuánto cuesta hacer 500 tarjetas para presentar tu propuesta y captar nuevos apoyos de manera inmediata? Esta cantidad de tarjetas puede costar a partir de 7,25€. Busca la página web que más confianza te dé o imprimelas en una copistería, y pide a todo el mundo que te ayude a distribuirlas: amigos y familiares, vecinos, compañeros de trabajo, gente del barrio... ¡a quien tú quieras! No importa que no conozcas a la gente a la cual solicitas el apoyo para tu propuesta, ¡quien menos lo esperes te puede ayudar! Pero debes ponérselo fácil, por eso: añade el título y el identificador de tu propuesta en la tarjeta, el enlace a la web decide.madrid.es y tu nombre ¡y no te olvides de pedirles a todos/as que te apoyen, no sólo que visiten el link!</p>\r\n",
|
||||
Dashboard::Action.create(title: "Crea tarjetas de visita adaptándolas para "\
|
||||
"difundir tu propuesta",
|
||||
description: "<p>¿Sabes cuánto cuesta hacer 500 tarjetas para "\
|
||||
"presentar tu propuesta y captar nuevos apoyos de manera inmediata? "\
|
||||
"Esta cantidad de tarjetas puede costar a partir de 7,25€. Busca "\
|
||||
"la página web que más confianza te dé o imprimelas en una "\
|
||||
"copistería, y pide a todo el mundo que te ayude a distribuirlas: "\
|
||||
"amigos y familiares, vecinos, compañeros de trabajo, gente del "\
|
||||
"barrio... ¡a quien tú quieras! No importa que no conozcas a la "\
|
||||
"gente a la cual solicitas el apoyo para tu propuesta, ¡quien menos "\
|
||||
"lo esperes te puede ayudar! Pero debes ponérselo fácil, por eso: "\
|
||||
"añade el título y el identificador de tu propuesta en la tarjeta, "\
|
||||
"el enlace a la web decide.madrid.es y tu nombre ¡y no te olvides de "\
|
||||
"pedirles a todos/as que te apoyen, no sólo que visiten "\
|
||||
"el link!</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 5,
|
||||
required_supports: 0,
|
||||
order: 23,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Es una manera directa y diferente de llegar a más gente",
|
||||
short_description: "Es una manera directa y diferente de llegar a "\
|
||||
"más gente",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Pide que te apoyen en tu trabajo",
|
||||
description: "<p>No dudes en hacerles saber de la creación de tu propuesta y de la necesidad de su apoyo por su parte para lograr hacerla realidad. En ellos y ellas, encontrarás una fuente de apoyo enorme que puede extenderse más allá si logras que hablen de la propuesta en sus entornos personales, por eso vale la pena hacer el esfuerzo durante un sólo día y no resultar demasiado insistente. <br />\r\n<br />\r\nPara ello, puedes contarles personalmente la motivación que te llevó a publicar la propuesta o explicarlo en grupo en los momentos de descanso. También pedir permiso a tu jefe/a para enviar un email a todos solicitando el apoyo. Puedes utilizar las tarjetas de visita o el cártel que ya conoces. Una vez lo tengas, pide permiso, y pégalo en distintos lugares como la entrada del baño, la zona de descanso... </p>\r\n",
|
||||
description: "<p>No dudes en hacerles saber de la creación de "\
|
||||
"tu propuesta y de la necesidad de su apoyo por su parte para "\
|
||||
"lograr hacerla realidad. En ellos y ellas, encontrarás una fuente "\
|
||||
"de apoyo enorme que puede extenderse más allá si logras que hablen "\
|
||||
"de la propuesta en sus entornos personales, por eso vale la pena "\
|
||||
"hacer el esfuerzo durante un sólo día y no resultar demasiado "\
|
||||
"insistente. <br />\r\n<br />\r\nPara ello, puedes contarles "\
|
||||
"personalmente la motivación que te llevó a publicar la propuesta "\
|
||||
"o explicarlo en grupo en los momentos de descanso. También pedir "\
|
||||
"permiso a tu jefe/a para enviar un email a todos solicitando el "\
|
||||
"apoyo. Puedes utilizar las tarjetas de visita o el cártel que ya "\
|
||||
"conoces. Una vez lo tengas, pide permiso, y pégalo en distintos "\
|
||||
"lugares como la entrada del baño, la zona de descanso... </p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 6,
|
||||
required_supports: 0,
|
||||
order: 24,
|
||||
active: true,
|
||||
action_type: 0,
|
||||
short_description: "Apóyate en tus compañeros y compañeras de trabajo, ¡son cruciales!",
|
||||
short_description: "Apóyate en tus compañeros y compañeras de "\
|
||||
"trabajo, ¡son cruciales!",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Manual Diez claves",
|
||||
description: "<p>En estos momentos tu propuesta aún esta en modo borrador, es un momento perfecto para leerte este resumen que trata cómo publicar una propuesta ciudadana y empezar ya a reunir apoyos. Aunque ya habrás superado alguno de los pasos que repasa este artículo, como por ejemplo hacerte usuario/a, hay muchos otros que te pueden muy útiles, ya que incorporan recomendaciones. Es el caso de los consejos para conseguir una mejor redacción o con qué archivos podrías complementar la información que estás introduciendo en el formulario. ¡Échale un vistazo! </p>\r\n\r\n<p> </p>\r\n",
|
||||
description: "<p>En estos momentos tu propuesta aún esta en modo "\
|
||||
"borrador, es un momento perfecto para leerte este resumen que "\
|
||||
"trata cómo publicar una propuesta ciudadana y empezar ya a reunir "\
|
||||
"apoyos. Aunque ya habrás superado alguno de los pasos que repasa "\
|
||||
"este artículo, como por ejemplo hacerte usuario/a, hay muchos "\
|
||||
"otros que te pueden muy útiles, ya que incorporan recomendaciones. "\
|
||||
"Es el caso de los consejos para conseguir una mejor redacción o "\
|
||||
"con qué archivos podrías complementar la información que estás "\
|
||||
"introduciendo en el formulario. ¡Échale un vistazo!</p>\r\n",
|
||||
request_to_administrators: true,
|
||||
day_offset: 0,
|
||||
required_supports: 0,
|
||||
@@ -308,7 +542,15 @@ namespace :dashboards do
|
||||
short_description: "",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Imágenes para tus perfiles",
|
||||
description: "<p>Algunos ejemplos para inspirarte o incluir en los perfiles que tengas activos en redes sociales. Se trata de cambiar temporalmente la imágen típica de tu usuario o el banner general en tu espacio de perfil, por otra que anuncie que tienes una propuesta en decide y que buscas apoyo. Puedes utilizar alguno de ellos, crear tu mismo/a el slogan que mejor te vaya e ir cambiandolos regularmente. Es un espacio muy agradecido ya que cualquier persona que te conozca lo verá sin tener que hacer tanto esfuerzo por tu parte.</p>\r\n",
|
||||
description: "<p>Algunos ejemplos para inspirarte o incluir en los "\
|
||||
"perfiles que tengas activos en redes sociales. Se trata de cambiar "\
|
||||
"temporalmente la imágen típica de tu usuario o el banner general "\
|
||||
"en tu espacio de perfil, por otra que anuncie que tienes una "\
|
||||
"propuesta en decide y que buscas apoyo. Puedes utilizar alguno de "\
|
||||
"ellos, crear tu mismo/a el slogan que mejor te vaya e ir "\
|
||||
"cambiandolos regularmente. Es un espacio muy agradecido ya que "\
|
||||
"cualquier persona que te conozca lo verá sin tener que hacer "\
|
||||
"tanto esfuerzo por tu parte.</p>\r\n",
|
||||
request_to_administrators: false,
|
||||
day_offset: 1,
|
||||
required_supports: 0,
|
||||
@@ -325,7 +567,8 @@ namespace :dashboards do
|
||||
order: 3,
|
||||
active: true,
|
||||
action_type: 1,
|
||||
short_description: "Una difusión específica en las redes del Ayuntamiento",
|
||||
short_description: "Una difusión específica en las redes "\
|
||||
"del Ayuntamiento",
|
||||
published_proposal: true)
|
||||
Dashboard::Action.create(title: "Decide Corner",
|
||||
description: "",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
namespace :proposal_actions do
|
||||
desc 'Move link attribute to links collection'
|
||||
desc "Move link attribute to links collection"
|
||||
task migrate_links: :environment do
|
||||
ProposalDashboardAction.where.not(link: nil).each do |action|
|
||||
next if action.link.blank?
|
||||
@@ -11,9 +11,9 @@ namespace :proposal_actions do
|
||||
linkable: action
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Initialize proposal settings'
|
||||
desc "Initialize proposal settings"
|
||||
task initialize_settings: :environment do
|
||||
%w[
|
||||
proposals.successful_proposal_id
|
||||
@@ -29,14 +29,14 @@ namespace :proposal_actions do
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Publish all proposals'
|
||||
desc "Publish all proposals"
|
||||
task publish_all: :environment do
|
||||
Proposal.draft.find_each do |proposal|
|
||||
proposal.update(published_at: proposal.created_at)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Simulate successful proposal'
|
||||
desc "Simulate successful proposal"
|
||||
task create_successful_proposal: :environment do
|
||||
expected_supports = [
|
||||
1049,
|
||||
@@ -409,7 +409,7 @@ namespace :proposal_actions do
|
||||
]
|
||||
|
||||
votes_count = expected_supports.inject(0.0) { |sum, x| sum + x }
|
||||
goal_votes = Setting['votes_for_proposal_success'].to_f
|
||||
goal_votes = Setting["votes_for_proposal_success"].to_f
|
||||
cached_votes_up = 0
|
||||
|
||||
tags = Faker::Lorem.words(25)
|
||||
@@ -423,7 +423,7 @@ namespace :proposal_actions do
|
||||
external_url: Faker::Internet.url,
|
||||
description: description,
|
||||
created_at: Time.now - expected_supports.length.days,
|
||||
tag_list: tags.sample(3).join(','),
|
||||
tag_list: tags.sample(3).join(","),
|
||||
geozone: Geozone.all.sample,
|
||||
skip_map: "1",
|
||||
terms_of_service: "1",
|
||||
@@ -438,27 +438,27 @@ namespace :proposal_actions do
|
||||
user = User.create!(
|
||||
username: "user_#{proposal.id}_#{day_offset}_#{i}",
|
||||
email: "user_#{proposal.id}_#{day_offset}_#{i}@consul.dev",
|
||||
password: '12345678',
|
||||
password_confirmation: '12345678',
|
||||
password: "12345678",
|
||||
password_confirmation: "12345678",
|
||||
confirmed_at: Time.current - expected_supports.length.days,
|
||||
terms_of_service: '1',
|
||||
gender: ['Male', 'Female'].sample,
|
||||
terms_of_service: "1",
|
||||
gender: ["Male", "Female"].sample,
|
||||
date_of_birth: rand((Time.current - 80.years)..(Time.current - 16.years)),
|
||||
public_activity: (rand(1..100) > 30)
|
||||
)
|
||||
|
||||
Vote.create!(
|
||||
votable: proposal,
|
||||
voter: user,
|
||||
vote_flag: false,
|
||||
vote_weight: 1,
|
||||
votable: proposal,
|
||||
voter: user,
|
||||
vote_flag: false,
|
||||
vote_weight: 1,
|
||||
created_at: proposal.published_at + day_offset.days,
|
||||
updated_at: proposal.published_at + day_offset.days
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Setting['proposals.successful_proposal_id'] = proposal.id
|
||||
Setting["proposals.successful_proposal_id"] = proposal.id
|
||||
proposal.update(cached_votes_up: cached_votes_up)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -107,7 +107,7 @@ FactoryBot.define do
|
||||
association :actionable, factory: :proposal
|
||||
end
|
||||
|
||||
factory :dashboard_action, class: 'Dashboard::Action' do
|
||||
factory :dashboard_action, class: "Dashboard::Action" do
|
||||
title { Faker::Lorem.sentence[0..79] }
|
||||
description { Faker::Lorem.sentence }
|
||||
link nil
|
||||
@@ -117,7 +117,7 @@ FactoryBot.define do
|
||||
order 0
|
||||
active true
|
||||
hidden_at nil
|
||||
action_type 'proposed_action'
|
||||
action_type "proposed_action"
|
||||
|
||||
trait :admin_request do
|
||||
request_to_administrators true
|
||||
@@ -140,21 +140,21 @@ FactoryBot.define do
|
||||
end
|
||||
|
||||
trait :proposed_action do
|
||||
action_type 'proposed_action'
|
||||
action_type "proposed_action"
|
||||
end
|
||||
|
||||
trait :resource do
|
||||
action_type 'resource'
|
||||
action_type "resource"
|
||||
end
|
||||
end
|
||||
|
||||
factory :dashboard_executed_action, class: 'Dashboard::ExecutedAction' do
|
||||
factory :dashboard_executed_action, class: "Dashboard::ExecutedAction" do
|
||||
proposal
|
||||
action { |s| s.association(:dashboard_action) }
|
||||
executed_at { Time.current }
|
||||
end
|
||||
|
||||
factory :dashboard_administrator_task, class: 'Dashboard::AdministratorTask' do
|
||||
factory :dashboard_administrator_task, class: "Dashboard::AdministratorTask" do
|
||||
source { |s| s.association(:dashboard_executed_action) }
|
||||
user
|
||||
executed_at { Time.current }
|
||||
|
||||
@@ -1,66 +1,65 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
feature 'Admin administrator tasks' do
|
||||
feature "Admin administrator tasks" do
|
||||
let(:admin) { create :administrator }
|
||||
|
||||
before do
|
||||
login_as(admin.user)
|
||||
end
|
||||
|
||||
context 'when visiting index' do
|
||||
context 'and no pending tasks' do
|
||||
context "when visiting index" do
|
||||
context "and no pending tasks" do
|
||||
before do
|
||||
visit admin_dashboard_administrator_tasks_path
|
||||
end
|
||||
|
||||
scenario 'shows that there are no records available' do
|
||||
expect(page).to have_content('There are no pending tasks')
|
||||
scenario "shows that there are no records available" do
|
||||
expect(page).to have_content("There are no pending tasks")
|
||||
end
|
||||
end
|
||||
|
||||
context 'and actions defined' do
|
||||
context "and actions defined" do
|
||||
let!(:task) { create :dashboard_administrator_task, :pending }
|
||||
|
||||
before do
|
||||
visit admin_dashboard_administrator_tasks_path
|
||||
end
|
||||
|
||||
scenario 'shows the task data' do
|
||||
scenario "shows the task data" do
|
||||
expect(page).to have_content(task.source.proposal.title)
|
||||
expect(page).to have_content(task.source.action.title)
|
||||
end
|
||||
|
||||
scenario 'has a link that allows solving the request' do
|
||||
expect(page).to have_link('Solve')
|
||||
scenario "has a link that allows solving the request" do
|
||||
expect(page).to have_link("Solve")
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
context 'when solving a task' do
|
||||
context "when solving a task" do
|
||||
let!(:task) { create :dashboard_administrator_task, :pending }
|
||||
|
||||
before do
|
||||
visit admin_dashboard_administrator_tasks_path
|
||||
click_link 'Solve'
|
||||
click_link "Solve"
|
||||
end
|
||||
|
||||
scenario 'Shows task details and link to proposal' do
|
||||
scenario "Shows task details and link to proposal" do
|
||||
expect(page).to have_link(task.source.proposal.title)
|
||||
expect(page).to have_content(task.source.action.title)
|
||||
end
|
||||
|
||||
scenario 'contains a button that solves the request' do
|
||||
expect(page).to have_button('Mark as solved')
|
||||
scenario "contains a button that solves the request" do
|
||||
expect(page).to have_button("Mark as solved")
|
||||
end
|
||||
|
||||
scenario 'After it is solved dissapears from the list' do
|
||||
click_button 'Mark as solved'
|
||||
scenario "After it is solved dissapears from the list" do
|
||||
click_button "Mark as solved"
|
||||
|
||||
expect(page).not_to have_link(task.source.proposal.title)
|
||||
expect(page).not_to have_content(task.source.action.title)
|
||||
expect(page).to have_content('The task has been marked as solved')
|
||||
expect(page).to have_content("The task has been marked as solved")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ feature "Proposal's dashboard" do
|
||||
scenario "Dashboard progress display link to new page for proposed actions when
|
||||
there are more than four proposed actions", js: true do
|
||||
create_list(:dashboard_action, 4, :proposed_action, :active)
|
||||
action_5 = create(:dashboard_action, :proposed_action, :active)
|
||||
create(:dashboard_action, :proposed_action, :active)
|
||||
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
@@ -112,12 +112,6 @@ feature "Proposal's dashboard" do
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Display no results text when there are not proposed_actions done" do
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
expect(page).to have_content("No recommended actions done")
|
||||
end
|
||||
|
||||
scenario "Dashboard progress can execute proposed action" do
|
||||
action = create(:dashboard_action, :proposed_action, :active)
|
||||
|
||||
@@ -334,7 +328,7 @@ feature "Proposal's dashboard" do
|
||||
scenario "On recommended actions section display link for toggle when there are
|
||||
more than four proposed actions", js: true do
|
||||
create_list(:dashboard_action, 4, :proposed_action, :active)
|
||||
action_5 = create(:dashboard_action, :proposed_action, :active)
|
||||
create(:dashboard_action, :proposed_action, :active)
|
||||
|
||||
visit recommended_actions_proposal_dashboard_path(proposal.to_param)
|
||||
|
||||
@@ -360,8 +354,7 @@ feature "Proposal's dashboard" do
|
||||
end
|
||||
end
|
||||
|
||||
scenario "On recommended actions section contains no results text when there are
|
||||
not proposed_actions pending" do
|
||||
scenario "No recommended actions pending" do
|
||||
visit recommended_actions_proposal_dashboard_path(proposal.to_param)
|
||||
|
||||
expect(page).to have_content("No recommended actions pending")
|
||||
@@ -378,8 +371,7 @@ feature "Proposal's dashboard" do
|
||||
end
|
||||
end
|
||||
|
||||
scenario "On recommended actions section contains no_results_text when there are
|
||||
not proposed_actions pending" do
|
||||
scenario "No recommended actions done" do
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
expect(page).to have_content("No recommended actions done")
|
||||
@@ -392,65 +384,69 @@ feature "Proposal's dashboard" do
|
||||
end
|
||||
|
||||
scenario "Display tag 'new' on resouce when it is new for author since last login" do
|
||||
resource = create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: false)
|
||||
resource = create(:dashboard_action, :resource, :active, day_offset: 0,
|
||||
published_proposal: false)
|
||||
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
within "#dashboard_action_#{resource.id}" do
|
||||
expect(page).to have_content('New')
|
||||
expect(page).to have_content("New")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Not display tag 'new' on resouce when there is not new resources since last login" do
|
||||
resource = create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: false)
|
||||
resource = create(:dashboard_action, :resource, :active, day_offset: 0,
|
||||
published_proposal: false)
|
||||
proposal.author.update(last_sign_in_at: Date.today)
|
||||
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
within "#dashboard_action_#{resource.id}" do
|
||||
expect(page).not_to have_content('New')
|
||||
expect(page).not_to have_content("New")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Display tag 'new' on proposed_action when it is new for author since last login" do
|
||||
proposed_action = create(:dashboard_action, :proposed_action, :active, day_offset: 0, published_proposal: false)
|
||||
proposed_action = create(:dashboard_action, :proposed_action, :active, day_offset: 0,
|
||||
published_proposal: false)
|
||||
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
within "#dashboard_action_#{proposed_action.id}" do
|
||||
expect(page).to have_content('New')
|
||||
expect(page).to have_content("New")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Not display tag 'new' on proposed_action when there is not new proposed_action since last login" do
|
||||
proposed_action = create(:dashboard_action, :proposed_action, :active, day_offset: 0, published_proposal: false)
|
||||
scenario "Not display tag 'new' on proposed_action when there is not new since last login" do
|
||||
proposed_action = create(:dashboard_action, :proposed_action, :active, day_offset: 0,
|
||||
published_proposal: false)
|
||||
proposal.author.update(last_sign_in_at: Date.today)
|
||||
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
within "#dashboard_action_#{proposed_action.id}" do
|
||||
expect(page).not_to have_content('New')
|
||||
expect(page).not_to have_content("New")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Display tag 'new' on sidebar menu when there is a new resouce since last login" do
|
||||
resource = create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: false)
|
||||
create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: false)
|
||||
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
within "#side_menu" do
|
||||
expect(page).to have_content('New')
|
||||
expect(page).to have_content("New")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Not display tag 'new' on sidebar menu when there is not a new resouce since last login" do
|
||||
resource = create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: false)
|
||||
scenario "Not display tag 'new' on sidebar when there is not a new resouce since last login" do
|
||||
create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: false)
|
||||
proposal.author.update(last_sign_in_at: Date.today)
|
||||
|
||||
visit progress_proposal_dashboard_path(proposal)
|
||||
|
||||
within "#side_menu" do
|
||||
expect(page).not_to have_content('New')
|
||||
expect(page).not_to have_content("New")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
feature 'Mailing' do
|
||||
feature "Mailing" do
|
||||
let!(:proposal) { create(:proposal, :draft) }
|
||||
|
||||
before do
|
||||
@@ -8,30 +8,29 @@ feature 'Mailing' do
|
||||
visit new_proposal_dashboard_mailing_path(proposal)
|
||||
end
|
||||
|
||||
scenario 'Has a link to preview the mail' do
|
||||
expect(page).to have_link('Preview')
|
||||
scenario "Has a link to preview the mail" do
|
||||
expect(page).to have_link("Preview")
|
||||
end
|
||||
|
||||
scenario 'Has a link to send the mail' do
|
||||
scenario "Has a link to send the mail" do
|
||||
expect(page).to have_link("Send to #{proposal.author.email}")
|
||||
end
|
||||
|
||||
scenario 'User receives feedback after the email is sent' do
|
||||
scenario "User receives feedback after the email is sent" do
|
||||
click_link "Send to #{proposal.author.email}"
|
||||
expect(page).to have_content("The email has been sent")
|
||||
end
|
||||
|
||||
scenario 'Preview contains the proposal title' do
|
||||
click_link 'Preview'
|
||||
scenario "Preview contains the proposal title" do
|
||||
click_link "Preview"
|
||||
|
||||
expect(page).to have_content(proposal.title)
|
||||
end
|
||||
|
||||
scenario 'Preview page can send the email as well' do
|
||||
click_link 'Preview'
|
||||
scenario "Preview page can send the email as well" do
|
||||
click_link "Preview"
|
||||
|
||||
expect(page).not_to have_link('Preview')
|
||||
expect(page).not_to have_link("Preview")
|
||||
expect(page).to have_link("Send to #{proposal.author.email}")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
feature 'Poster' do
|
||||
feature "Poster" do
|
||||
let!(:proposal) { create(:proposal, :draft) }
|
||||
|
||||
before do
|
||||
@@ -8,30 +8,30 @@ feature 'Poster' do
|
||||
visit new_proposal_dashboard_poster_path(proposal)
|
||||
end
|
||||
|
||||
scenario 'Has a link to preview the poster' do
|
||||
expect(page).to have_link('Preview')
|
||||
scenario "Has a link to preview the poster" do
|
||||
expect(page).to have_link("Preview")
|
||||
end
|
||||
|
||||
scenario 'Has a link to download the poster' do
|
||||
expect(page).to have_link('Download')
|
||||
scenario "Has a link to download the poster" do
|
||||
expect(page).to have_link("Download")
|
||||
end
|
||||
|
||||
scenario 'Preview contains the proposal details' do
|
||||
click_link 'Preview'
|
||||
scenario "Preview contains the proposal details" do
|
||||
click_link "Preview"
|
||||
|
||||
expect(page).to have_content(proposal.title)
|
||||
expect(page).to have_content(proposal.code)
|
||||
end
|
||||
|
||||
scenario 'Preview page can download the poster as well' do
|
||||
click_link 'Preview'
|
||||
scenario "Preview page can download the poster as well" do
|
||||
click_link "Preview"
|
||||
|
||||
expect(page).not_to have_link('Preview')
|
||||
expect(page).to have_link('Download')
|
||||
expect(page).not_to have_link("Preview")
|
||||
expect(page).to have_link("Download")
|
||||
end
|
||||
|
||||
scenario 'PDF contains the proposal details', js: true do
|
||||
click_link 'Download'
|
||||
scenario "PDF contains the proposal details", js: true do
|
||||
click_link "Download"
|
||||
|
||||
page.driver.browser.switch_to.window page.driver.browser.window_handles.last do
|
||||
expect(page).to have_content(proposal.title)
|
||||
@@ -39,4 +39,3 @@ feature 'Poster' do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -153,13 +153,13 @@ describe Abilities::Common do
|
||||
it { should_not be_able_to(:destroy, proposal_image) }
|
||||
it { should_not be_able_to(:destroy, proposal_document) }
|
||||
end
|
||||
|
||||
describe 'proposals dashboard' do
|
||||
|
||||
describe "proposals dashboard" do
|
||||
it { should be_able_to(:dashboard, own_proposal) }
|
||||
it { should_not be_able_to(:dashboard, proposal) }
|
||||
end
|
||||
|
||||
describe 'proposal polls' do
|
||||
describe "proposal polls" do
|
||||
let(:poll) { create(:poll, related: own_proposal) }
|
||||
|
||||
it { should be_able_to(:manage_polls, own_proposal) }
|
||||
@@ -168,17 +168,17 @@ describe Abilities::Common do
|
||||
it { should be_able_to(:results, poll) }
|
||||
end
|
||||
|
||||
describe 'proposal mailing' do
|
||||
describe "proposal mailing" do
|
||||
it { should be_able_to(:manage_mailing, own_proposal) }
|
||||
it { should_not be_able_to(:manage_mailing, proposal) }
|
||||
end
|
||||
|
||||
describe 'proposal poster' do
|
||||
describe "proposal poster" do
|
||||
it { should be_able_to(:manage_poster, own_proposal) }
|
||||
it { should_not be_able_to(:manage_poster, proposal) }
|
||||
end
|
||||
|
||||
describe 'publishing proposals' do
|
||||
describe "publishing proposals" do
|
||||
let(:draft_own_proposal) { create(:proposal, :draft, author: user) }
|
||||
let(:retired_proposal) { create(:proposal, :draft, :retired, author: user) }
|
||||
|
||||
|
||||
@@ -36,38 +36,38 @@ describe Abilities::Everyone do
|
||||
it { should_not be_able_to(:read_results, reviewing_ballot_budget) }
|
||||
it { should_not be_able_to(:manage, Dashboard::Action) }
|
||||
|
||||
context 'when accessing poll results' do
|
||||
context "when accessing poll results" do
|
||||
let(:results_enabled) { true }
|
||||
let(:poll) { create(:poll, :expired, results_enabled: results_enabled) }
|
||||
|
||||
it { should be_able_to(:results, poll) }
|
||||
|
||||
context 'and results disabled' do
|
||||
context "and results disabled" do
|
||||
let(:results_enabled) { false }
|
||||
|
||||
it { should_not be_able_to(:results, poll) }
|
||||
end
|
||||
|
||||
context 'and not expired' do
|
||||
context "and not expired" do
|
||||
let(:poll) { create(:poll, :current, results_enabled: true) }
|
||||
|
||||
it { should_not be_able_to(:results, poll) }
|
||||
end
|
||||
end
|
||||
|
||||
context 'when accessing poll stats' do
|
||||
context "when accessing poll stats" do
|
||||
let(:stats_enabled) { true }
|
||||
let(:poll) { create(:poll, :expired, stats_enabled: stats_enabled) }
|
||||
|
||||
it { should be_able_to(:stats, poll) }
|
||||
|
||||
context 'and stats disabled' do
|
||||
context "and stats disabled" do
|
||||
let(:stats_enabled) { false }
|
||||
|
||||
it { should_not be_able_to(:stats, poll) }
|
||||
end
|
||||
|
||||
context 'and not expired' do
|
||||
context "and not expired" do
|
||||
let(:poll) { create(:poll, :current, stats_enabled: true) }
|
||||
|
||||
it { should_not be_able_to(:stats, poll) }
|
||||
|
||||
@@ -281,8 +281,10 @@ describe Dashboard::Action do
|
||||
|
||||
|
||||
it "when proposal has been created today and day_offset is valid only for today" do
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).to include(resource.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).to include(action.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).to include(resource.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).to include(action.id)
|
||||
end
|
||||
|
||||
it "when proposal has received a new vote today" do
|
||||
@@ -291,8 +293,10 @@ describe Dashboard::Action do
|
||||
resource.update(required_supports: 0)
|
||||
create(:vote, voter: proposal.author, votable: proposal)
|
||||
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).to include(action.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).not_to include(resource.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).to include(action.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).not_to include(resource.id)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -306,8 +310,10 @@ describe Dashboard::Action do
|
||||
published_proposal: false) }
|
||||
|
||||
it "when day_offset field is valid for today and invalid for yesterday" do
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).to include(resource.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).to include(action.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).to include(resource.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).to include(action.id)
|
||||
end
|
||||
|
||||
it "when proposal has received a new vote today" do
|
||||
@@ -316,8 +322,10 @@ describe Dashboard::Action do
|
||||
resource.update(required_supports: 2)
|
||||
create(:vote, voter: proposal.author, votable: proposal)
|
||||
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).to include(action.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday, proposal)).not_to include(resource.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).to include(action.id)
|
||||
expect(described_class.detect_new_actions_since(Date.yesterday,
|
||||
proposal)).not_to include(resource.id)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
describe Dashboard::AdministratorTask do
|
||||
it 'is invalid when source is nil' do
|
||||
it "is invalid when source is nil" do
|
||||
task = build(:dashboard_administrator_task, source: nil)
|
||||
expect(task).not_to be_valid
|
||||
end
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
describe Dashboard::ExecutedAction do
|
||||
let(:proposal) { create :proposal }
|
||||
let(:action) do
|
||||
let(:action) do
|
||||
create :dashboard_action, request_to_administrators: true, link: Faker::Internet.url
|
||||
end
|
||||
|
||||
it 'is invalid when proposal is nil' do
|
||||
it "is invalid when proposal is nil" do
|
||||
action = build(:dashboard_executed_action, proposal: nil)
|
||||
expect(action).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is invalid when action is nil' do
|
||||
it "is invalid when action is nil" do
|
||||
action = build(:dashboard_executed_action, action: nil)
|
||||
expect(action).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is invalid when executed_at is nil' do
|
||||
it "is invalid when executed_at is nil" do
|
||||
action = build(:dashboard_executed_action, executed_at: nil)
|
||||
expect(action).not_to be_valid
|
||||
end
|
||||
|
||||
it 'when action has been already executed it is invalid' do
|
||||
it "when action has been already executed it is invalid" do
|
||||
_executed = create(:dashboard_executed_action, proposal: proposal, action: action)
|
||||
action = build(:dashboard_executed_action, proposal: proposal, action: action)
|
||||
expect(action).not_to be_valid
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
describe Link do
|
||||
let(:action) { build :dashboard_action }
|
||||
|
||||
it 'is invalid when label is blank' do
|
||||
link = build(:link, linkable: action, label: '')
|
||||
it "is invalid when label is blank" do
|
||||
link = build(:link, linkable: action, label: "")
|
||||
expect(link).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is invalid when url is blank' do
|
||||
link = build(:link, linkable: action, url: '')
|
||||
it "is invalid when url is blank" do
|
||||
link = build(:link, linkable: action, url: "")
|
||||
expect(link).not_to be_valid
|
||||
end
|
||||
end
|
||||
|
||||
@@ -34,48 +34,55 @@ describe Poll do
|
||||
expect(poll).not_to be_valid
|
||||
end
|
||||
|
||||
it 'no overlapping polls for proposal polls are allowed' do
|
||||
it "no overlapping polls for proposal polls are allowed" do
|
||||
end
|
||||
end
|
||||
|
||||
describe 'proposal polls specific validations' do
|
||||
describe "proposal polls specific validations" do
|
||||
let(:proposal) { create(:proposal) }
|
||||
let(:poll) { build(:poll, related: proposal) }
|
||||
|
||||
it 'is valid when overlapping but different proposals' do
|
||||
it "is valid when overlapping but different proposals" do
|
||||
other_proposal = create(:proposal)
|
||||
_other_poll = create(:poll, related: other_proposal, starts_at: poll.starts_at, ends_at: poll.ends_at)
|
||||
_other_poll = create(:poll, related: other_proposal, starts_at: poll.starts_at,
|
||||
ends_at: poll.ends_at)
|
||||
|
||||
expect(poll).to be_valid
|
||||
end
|
||||
|
||||
it 'is valid when same proposal but not overlapping' do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.ends_at + 1.day, ends_at: poll.ends_at + 8.days)
|
||||
it "is valid when same proposal but not overlapping" do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.ends_at + 1.day,
|
||||
ends_at: poll.ends_at + 8.days)
|
||||
expect(poll).to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid when overlaps from the beginning' do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at - 8.days, ends_at: poll.starts_at)
|
||||
it "is not valid when overlaps from the beginning" do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at - 8.days,
|
||||
ends_at: poll.starts_at)
|
||||
expect(poll).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid when overlaps from the end' do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.ends_at, ends_at: poll.ends_at + 8.days)
|
||||
it "is not valid when overlaps from the end" do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.ends_at,
|
||||
ends_at: poll.ends_at + 8.days)
|
||||
expect(poll).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid when overlaps with same interval' do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at, ends_at: poll.ends_at)
|
||||
it "is not valid when overlaps with same interval" do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at,
|
||||
ends_at: poll.ends_at)
|
||||
expect(poll).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid when overlaps with interval contained' do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at + 1.day, ends_at: poll.ends_at - 1.day)
|
||||
it "is not valid when overlaps with interval contained" do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at + 1.day,
|
||||
ends_at: poll.ends_at - 1.day)
|
||||
expect(poll).not_to be_valid
|
||||
end
|
||||
|
||||
it 'is not valid when overlaps with interval containing' do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at - 8.days, ends_at: poll.ends_at + 8.days)
|
||||
it "is not valid when overlaps with interval containing" do
|
||||
_other_poll = create(:poll, related: proposal, starts_at: poll.starts_at - 8.days,
|
||||
ends_at: poll.ends_at + 8.days)
|
||||
expect(poll).not_to be_valid
|
||||
end
|
||||
end
|
||||
@@ -136,7 +143,8 @@ describe Poll do
|
||||
let!(:expired_poll) { create(:poll, :expired) }
|
||||
|
||||
let!(:current_restricted_poll) { create(:poll, geozone_restricted: true, geozones: [geozone]) }
|
||||
let!(:expired_restricted_poll) { create(:poll, :expired, geozone_restricted: true, geozones: [geozone]) }
|
||||
let!(:expired_restricted_poll) { create(:poll, :expired, geozone_restricted: true,
|
||||
geozones: [geozone]) }
|
||||
|
||||
let!(:all_polls) { [current_poll, expired_poll, current_poll, expired_restricted_poll] }
|
||||
let(:non_current_polls) { [expired_poll, expired_restricted_poll] }
|
||||
@@ -268,7 +276,7 @@ describe Poll do
|
||||
user = create(:user, :level_two)
|
||||
poll = create(:poll)
|
||||
|
||||
voter = create(:poll_voter, user: user, poll: poll)
|
||||
create(:poll_voter, user: user, poll: poll)
|
||||
|
||||
expect(poll.voted_by?(user)).to eq(true)
|
||||
end
|
||||
@@ -301,27 +309,31 @@ describe Poll do
|
||||
end
|
||||
end
|
||||
|
||||
describe '.overlaping_with' do
|
||||
describe ".overlaping_with" do
|
||||
let(:proposal) { create :proposal }
|
||||
let(:other_proposal) { create :proposal }
|
||||
let(:poll) { create(:poll, related: proposal) }
|
||||
let(:overlaping_poll) { build(:poll, related: proposal, starts_at: poll.starts_at + 1.day, ends_at: poll.ends_at - 1.day) }
|
||||
let(:non_overlaping_poll) { create(:poll, related: proposal, starts_at: poll.ends_at + 1.day, ends_at: poll.ends_at + 31.days) }
|
||||
let(:overlaping_poll_2) { create(:poll, related: other_proposal, starts_at: poll.starts_at + 1.day, ends_at: poll.ends_at - 1.day) }
|
||||
let(:overlaping_poll) { build(:poll, related: proposal, starts_at: poll.starts_at + 1.day,
|
||||
ends_at: poll.ends_at - 1.day) }
|
||||
let(:non_overlaping_poll) { create(:poll, related: proposal, starts_at: poll.ends_at + 1.day,
|
||||
ends_at: poll.ends_at + 31.days) }
|
||||
let(:overlaping_poll_2) { create(:poll, related: other_proposal,
|
||||
starts_at: poll.starts_at + 1.day,
|
||||
ends_at: poll.ends_at - 1.day) }
|
||||
|
||||
it 'a poll can not overlap itself' do
|
||||
it "a poll can not overlap itself" do
|
||||
expect(Poll.overlaping_with(poll)).not_to include(poll)
|
||||
end
|
||||
|
||||
it 'returns overlaping polls for the same proposal' do
|
||||
it "returns overlaping polls for the same proposal" do
|
||||
expect(Poll.overlaping_with(overlaping_poll)).to include(poll)
|
||||
end
|
||||
|
||||
it 'do not returs non overlaping polls for the same proposal' do
|
||||
it "do not returs non overlaping polls for the same proposal" do
|
||||
expect(Poll.overlaping_with(poll)).not_to include(non_overlaping_poll)
|
||||
end
|
||||
|
||||
it 'do not returns overlaping polls for other proposal' do
|
||||
it "do not returns overlaping polls for other proposal" do
|
||||
expect(Poll.overlaping_with(poll)).not_to include(overlaping_poll_2)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
describe "Retrieves achievements for a proposal" do
|
||||
describe Dashboard::AchievementsController do
|
||||
let(:created_at) { DateTime.parse("2018-01-01 12:00:00") }
|
||||
let(:proposal) { create(:proposal, created_at: created_at) }
|
||||
let(:executed_actions) { create_list(:dashboard_action, 8, :active, :proposed_action) }
|
||||
@@ -10,7 +10,8 @@ describe "Retrieves achievements for a proposal" do
|
||||
sign_in(proposal.author)
|
||||
|
||||
executed_actions.each_with_index do |action, index|
|
||||
create(:dashboard_executed_action, proposal: proposal, action: action, executed_at: proposal.created_at + index.days)
|
||||
create(:dashboard_executed_action, proposal: proposal, action: action,
|
||||
executed_at: proposal.created_at + index.days)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -32,7 +33,7 @@ describe "Retrieves achievements for a proposal" do
|
||||
end
|
||||
|
||||
it "returns a list of most recent executed achievements grouped by week" do
|
||||
get proposal_dashboard_achievements_path(proposal, group_by: 'week', format: :json)
|
||||
get proposal_dashboard_achievements_path(proposal, group_by: "week", format: :json)
|
||||
|
||||
json = JSON.parse(response.body, symbolize_names: true)
|
||||
|
||||
@@ -41,7 +42,7 @@ describe "Retrieves achievements for a proposal" do
|
||||
end
|
||||
|
||||
it "returns a list of most recent executed achievements grouped by month" do
|
||||
get proposal_dashboard_achievements_path(proposal, group_by: 'month', format: :json)
|
||||
get proposal_dashboard_achievements_path(proposal, group_by: "month", format: :json)
|
||||
|
||||
json = JSON.parse(response.body, symbolize_names: true)
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
describe "Retrieves number of supports for the successful proposal" do
|
||||
let(:created_at) { Time.now.beginning_of_day - 9.days }
|
||||
let(:proposal) { create(:proposal, created_at: created_at, published_at: created_at) }
|
||||
|
||||
before do
|
||||
@successful_proposal_id = Setting['proposals.successful_proposal_id']
|
||||
Setting['proposals.successful_proposal_id'] = proposal.id
|
||||
@successful_proposal_id = Setting["proposals.successful_proposal_id"]
|
||||
Setting["proposals.successful_proposal_id"] = proposal.id
|
||||
|
||||
8.times do |i|
|
||||
user = create(:user, :verified)
|
||||
Vote.create!(
|
||||
votable: proposal,
|
||||
voter: user,
|
||||
vote_weight: 1,
|
||||
created_at: proposal.created_at + i.days,
|
||||
votable: proposal,
|
||||
voter: user,
|
||||
vote_weight: 1,
|
||||
created_at: proposal.created_at + i.days,
|
||||
updated_at: proposal.created_at + i.days
|
||||
)
|
||||
end
|
||||
@@ -23,7 +23,7 @@ describe "Retrieves number of supports for the successful proposal" do
|
||||
end
|
||||
|
||||
after do
|
||||
Setting['proposals.successful_proposal_id'] = @successful_proposal_id
|
||||
Setting["proposals.successful_proposal_id"] = @successful_proposal_id
|
||||
end
|
||||
|
||||
it "returns the number of supports grouped by day" do
|
||||
@@ -37,7 +37,7 @@ describe "Retrieves number of supports for the successful proposal" do
|
||||
end
|
||||
|
||||
it "returns the number of supports grouped by week" do
|
||||
get proposal_dashboard_successful_supports_path(proposal, group_by: 'week', format: :json)
|
||||
get proposal_dashboard_successful_supports_path(proposal, group_by: "week", format: :json)
|
||||
|
||||
json = JSON.parse(response.body, symbolize_names: true)
|
||||
|
||||
@@ -48,7 +48,7 @@ describe "Retrieves number of supports for the successful proposal" do
|
||||
end
|
||||
|
||||
it "returns the number of supports grouped by month" do
|
||||
get proposal_dashboard_successful_supports_path(proposal, group_by: 'month', format: :json)
|
||||
get proposal_dashboard_successful_supports_path(proposal, group_by: "month", format: :json)
|
||||
|
||||
json = JSON.parse(response.body, symbolize_names: true)
|
||||
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
require 'rails_helper'
|
||||
require "rails_helper"
|
||||
|
||||
describe "Retrieves number of supports for a proposal" do
|
||||
describe Dashboard::GroupSupports do
|
||||
let(:created_at) { Time.now - 9.days }
|
||||
let(:proposal) { create(:proposal, created_at: created_at, published_at: created_at) }
|
||||
|
||||
before do
|
||||
8.times do |i|
|
||||
user = create(:user, :verified)
|
||||
Vote.create!(votable: proposal, voter: user, vote_weight: 1, created_at: proposal.created_at + i.days, updated_at: proposal.created_at + i.days)
|
||||
Vote.create!(votable: proposal, voter: user, vote_weight: 1,
|
||||
created_at: proposal.created_at + i.days,
|
||||
updated_at: proposal.created_at + i.days)
|
||||
end
|
||||
|
||||
sign_in(proposal.author)
|
||||
@@ -24,7 +26,7 @@ describe "Retrieves number of supports for a proposal" do
|
||||
end
|
||||
|
||||
it "returns the number of supports grouped by week" do
|
||||
get proposal_dashboard_supports_path(proposal, group_by: 'week', format: :json)
|
||||
get proposal_dashboard_supports_path(proposal, group_by: "week", format: :json)
|
||||
|
||||
json = JSON.parse(response.body, symbolize_names: true)
|
||||
|
||||
@@ -35,7 +37,7 @@ describe "Retrieves number of supports for a proposal" do
|
||||
end
|
||||
|
||||
it "returns the number of supports grouped by month" do
|
||||
get proposal_dashboard_supports_path(proposal, group_by: 'month', format: :json)
|
||||
get proposal_dashboard_supports_path(proposal, group_by: "month", format: :json)
|
||||
|
||||
json = JSON.parse(response.body, symbolize_names: true)
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
shared_examples "imageable destroy" do |imageable_factory_name, imageable_path, imageable_path_arguments|
|
||||
shared_examples "imageable destroy" do |imageable_factory_name,
|
||||
imageable_path,
|
||||
imageable_path_arguments|
|
||||
include ActionView::Helpers
|
||||
include ImagesHelper
|
||||
include ImageablesHelper
|
||||
|
||||
@@ -16,7 +16,7 @@ module RequestSpecHelper
|
||||
|
||||
private
|
||||
|
||||
def warden_scope(resource)
|
||||
resource.class.name.underscore.to_sym
|
||||
end
|
||||
def warden_scope(resource)
|
||||
resource.class.name.underscore.to_sym
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user