fixes conflicts with master
This commit is contained in:
@@ -461,7 +461,7 @@ Style/Lambda:
|
|||||||
|
|
||||||
# Offense count: 1
|
# Offense count: 1
|
||||||
# Cop supports --auto-correct.
|
# Cop supports --auto-correct.
|
||||||
Style/MethodCallParentheses:
|
Style/MethodCallWithoutArgsParentheses:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/controllers/management/document_verifications_controller.rb'
|
- 'app/controllers/management/document_verifications_controller.rb'
|
||||||
|
|
||||||
|
|||||||
1
Gemfile
1
Gemfile
@@ -64,6 +64,7 @@ gem 'tolk', '~> 2.0.0' # Web interface for translations
|
|||||||
gem 'browser'
|
gem 'browser'
|
||||||
gem 'turnout', '~> 2.4.0'
|
gem 'turnout', '~> 2.4.0'
|
||||||
gem 'redcarpet', '~> 3.4.0'
|
gem 'redcarpet', '~> 3.4.0'
|
||||||
|
gem 'rubyzip', '~> 1.2.0'
|
||||||
|
|
||||||
gem 'paperclip'
|
gem 'paperclip'
|
||||||
gem 'rails-assets-markdown-it', source: 'https://rails-assets.org'
|
gem 'rails-assets-markdown-it', source: 'https://rails-assets.org'
|
||||||
|
|||||||
@@ -371,6 +371,7 @@ GEM
|
|||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (~> 1.0, >= 1.0.1)
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
||||||
ruby-progressbar (1.8.1)
|
ruby-progressbar (1.8.1)
|
||||||
|
rubyzip (1.2.1)
|
||||||
rvm1-capistrano3 (1.4.0)
|
rvm1-capistrano3 (1.4.0)
|
||||||
capistrano (~> 3.0)
|
capistrano (~> 3.0)
|
||||||
sshkit (>= 1.2)
|
sshkit (>= 1.2)
|
||||||
@@ -530,6 +531,7 @@ DEPENDENCIES
|
|||||||
rollbar (~> 2.14.1)
|
rollbar (~> 2.14.1)
|
||||||
rspec-rails (~> 3.6)
|
rspec-rails (~> 3.6)
|
||||||
rubocop (~> 0.48.1)
|
rubocop (~> 0.48.1)
|
||||||
|
rubyzip (~> 1.2.0)
|
||||||
rvm1-capistrano3
|
rvm1-capistrano3
|
||||||
sass-rails (~> 5.0, >= 5.0.4)
|
sass-rails (~> 5.0, >= 5.0.4)
|
||||||
savon
|
savon
|
||||||
@@ -547,4 +549,4 @@ DEPENDENCIES
|
|||||||
whenever
|
whenever
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
1.14.6
|
1.15.0
|
||||||
|
|||||||
@@ -97,6 +97,10 @@ body.admin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
td.break {
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
&.fixed {
|
&.fixed {
|
||||||
table-layout: fixed;
|
table-layout: fixed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1141,10 +1141,8 @@ img.avatar, img.admin-avatar, img.moderator-avatar, img.initialjs-avatar {
|
|||||||
// 10. Officials levels
|
// 10. Officials levels
|
||||||
// --------------------
|
// --------------------
|
||||||
|
|
||||||
[class^="level-"] {
|
.level-1, .level-2, .level-3,
|
||||||
color: black;
|
.level-4, .level-5,
|
||||||
}
|
|
||||||
|
|
||||||
.is-author, .is-association {
|
.is-author, .is-association {
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -206,9 +206,9 @@
|
|||||||
.participation-not-allowed {
|
.participation-not-allowed {
|
||||||
background: $warning-bg;
|
background: $warning-bg;
|
||||||
color: $color-warning;
|
color: $color-warning;
|
||||||
height: 100%;
|
|
||||||
left: 0;
|
left: 0;
|
||||||
line-height: $line-height;
|
line-height: $line-height;
|
||||||
|
min-height: 100%;
|
||||||
padding: $line-height $line-height/2;
|
padding: $line-height $line-height/2;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|||||||
37
app/controllers/admin/administrators_controller.rb
Normal file
37
app/controllers/admin/administrators_controller.rb
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
class Admin::AdministratorsController < Admin::BaseController
|
||||||
|
load_and_authorize_resource
|
||||||
|
|
||||||
|
def index
|
||||||
|
@administrators = @administrators.page(params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def search
|
||||||
|
@user = User.find_by(email: params[:email])
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
if @user
|
||||||
|
@administrator = Administrator.find_or_initialize_by(user: @user)
|
||||||
|
format.js
|
||||||
|
else
|
||||||
|
format.js { render "user_not_found" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@administrator.user_id = params[:user_id]
|
||||||
|
@administrator.save
|
||||||
|
|
||||||
|
redirect_to admin_administrators_path
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
if current_user.id == @administrator.user_id
|
||||||
|
flash[:error] = I18n.t("admin.administrators.administrator.restricted_removal")
|
||||||
|
else
|
||||||
|
@administrator.destroy
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to admin_administrators_path
|
||||||
|
end
|
||||||
|
end
|
||||||
12
app/controllers/admin/newsletters_controller.rb
Normal file
12
app/controllers/admin/newsletters_controller.rb
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
class Admin::NewslettersController < Admin::BaseController
|
||||||
|
|
||||||
|
def index
|
||||||
|
end
|
||||||
|
|
||||||
|
def users
|
||||||
|
zip = NewsletterZip.new('emails')
|
||||||
|
zip.create
|
||||||
|
send_file(File.join(zip.path), type: 'application/zip')
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -29,7 +29,7 @@ module AdminHelper
|
|||||||
end
|
end
|
||||||
|
|
||||||
def menu_profiles?
|
def menu_profiles?
|
||||||
["organizations", "officials", "moderators", "valuators", "managers"].include? controller_name
|
["administrators", "organizations", "officials", "moderators", "valuators", "managers"].include? controller_name
|
||||||
end
|
end
|
||||||
|
|
||||||
def menu_banners?
|
def menu_banners?
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ module Abilities
|
|||||||
|
|
||||||
can :comment_as_administrator, [Debate, Comment, Proposal, Poll::Question, Budget::Investment, Legislation::Question, Legislation::Annotation]
|
can :comment_as_administrator, [Debate, Comment, Proposal, Poll::Question, Budget::Investment, Legislation::Question, Legislation::Annotation]
|
||||||
|
|
||||||
|
can [:search, :create, :index, :destroy], ::Administrator
|
||||||
can [:search, :create, :index, :destroy], ::Moderator
|
can [:search, :create, :index, :destroy], ::Moderator
|
||||||
can [:search, :create, :index, :summary], ::Valuator
|
can [:search, :create, :index, :summary], ::Valuator
|
||||||
can [:search, :create, :index, :destroy], ::Manager
|
can [:search, :create, :index, :destroy], ::Manager
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ class Budget
|
|||||||
return :not_selected unless selected?
|
return :not_selected unless selected?
|
||||||
return :no_ballots_allowed unless budget.balloting?
|
return :no_ballots_allowed unless budget.balloting?
|
||||||
return :different_heading_assigned unless ballot.valid_heading?(heading)
|
return :different_heading_assigned unless ballot.valid_heading?(heading)
|
||||||
return :not_enough_money if ballot.present? && !enough_money?(ballot)
|
return :not_enough_money_html if ballot.present? && !enough_money?(ballot)
|
||||||
end
|
end
|
||||||
|
|
||||||
def permission_problem(user)
|
def permission_problem(user)
|
||||||
|
|||||||
@@ -50,10 +50,10 @@ class Poll
|
|||||||
if dob.blank?
|
if dob.blank?
|
||||||
nil
|
nil
|
||||||
else
|
else
|
||||||
now = Time.now.utc.to_date
|
now = Time.current.to_date
|
||||||
now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
|
now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ class User < ActiveRecord::Base
|
|||||||
scope :moderators, -> { joins(:moderator) }
|
scope :moderators, -> { joins(:moderator) }
|
||||||
scope :organizations, -> { joins(:organization) }
|
scope :organizations, -> { joins(:organization) }
|
||||||
scope :officials, -> { where("official_level > 0") }
|
scope :officials, -> { where("official_level > 0") }
|
||||||
|
scope :newsletter, -> { where(newsletter: true) }
|
||||||
scope :for_render, -> { includes(:organization) }
|
scope :for_render, -> { includes(:organization) }
|
||||||
scope :by_document, -> (document_type, document_number) { where(document_type: document_type, document_number: document_number) }
|
scope :by_document, -> (document_type, document_number) { where(document_type: document_type, document_number: document_number) }
|
||||||
scope :email_digest, -> { where(email_digest: true) }
|
scope :email_digest, -> { where(email_digest: true) }
|
||||||
|
|||||||
@@ -95,6 +95,10 @@
|
|||||||
<strong><%= t("admin.menu.title_profiles") %></strong>
|
<strong><%= t("admin.menu.title_profiles") %></strong>
|
||||||
</a>
|
</a>
|
||||||
<ul <%= "class=is-active" if menu_profiles? %>>
|
<ul <%= "class=is-active" if menu_profiles? %>>
|
||||||
|
<li <%= "class=active" if controller_name == "administrators" %>>
|
||||||
|
<%= link_to t("admin.menu.administrators"), admin_administrators_path %>
|
||||||
|
</li>
|
||||||
|
|
||||||
<li <%= "class=active" if controller_name == "organizations" %>>
|
<li <%= "class=active" if controller_name == "organizations" %>>
|
||||||
<%= link_to t("admin.menu.organizations"), admin_organizations_path %>
|
<%= link_to t("admin.menu.organizations"), admin_organizations_path %>
|
||||||
</li>
|
</li>
|
||||||
@@ -171,5 +175,12 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<li <%= "class=active" if controller_name == "newsletter" %>>
|
||||||
|
<%= link_to admin_newsletters_path do %>
|
||||||
|
<span class="icon-zip"></span>
|
||||||
|
<%= t("admin.menu.newsletter") %>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
26
app/views/admin/administrators/_administrator.html.erb
Normal file
26
app/views/admin/administrators/_administrator.html.erb
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<div class="small-12 column">
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<%= administrator.name %>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<%= administrator.email %>
|
||||||
|
</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<% if administrator.persisted? %>
|
||||||
|
<%= link_to t('admin.administrators.administrator.delete'),
|
||||||
|
admin_administrator_path(administrator),
|
||||||
|
method: :delete,
|
||||||
|
class: "button hollow alert" %>
|
||||||
|
<% else %>
|
||||||
|
<%= link_to t('admin.administrators.administrator.add'),{ controller: "admin/administrators", action: :create, user_id: administrator.user_id },
|
||||||
|
method: :post,
|
||||||
|
class: "button success" %>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
46
app/views/admin/administrators/index.html.erb
Normal file
46
app/views/admin/administrators/index.html.erb
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<h2 class="inline-block"><%= t("admin.administrators.index.title") %></h2>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<%= form_tag search_admin_administrators_path, method: :get, remote: true do %>
|
||||||
|
<div class="small-12 medium-6 column">
|
||||||
|
<%= text_field_tag :email, '', placeholder: t('admin.administrators.search.email_placeholder') %>
|
||||||
|
</div>
|
||||||
|
<div class="small-12 medium-6 column">
|
||||||
|
<%= submit_tag t('admin.administrators.search.search'), class: 'button' %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="search-result" class="row"></div>
|
||||||
|
|
||||||
|
<h3><%= page_entries_info @administrators %></h3>
|
||||||
|
|
||||||
|
<table id="administrators">
|
||||||
|
<% @administrators.each do |administrator| %>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<%= administrator.name %>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<%= administrator.email %>
|
||||||
|
</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<% if administrator.persisted? %>
|
||||||
|
<%= link_to t('admin.administrators.administrator.delete'),
|
||||||
|
admin_administrator_path(administrator),
|
||||||
|
method: :delete,
|
||||||
|
class: "button hollow alert"
|
||||||
|
%>
|
||||||
|
<% else %>
|
||||||
|
<%= link_to t('admin.administrators.administrator.add'),
|
||||||
|
{ controller: "admin/administrators", action: :create,
|
||||||
|
user_id: administrator.user_id },
|
||||||
|
method: :post,
|
||||||
|
class: "button success" %>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<%= paginate @administrators %>
|
||||||
1
app/views/admin/administrators/search.js.erb
Normal file
1
app/views/admin/administrators/search.js.erb
Normal file
@@ -0,0 +1 @@
|
|||||||
|
$("#search-result").html("<%= j render 'administrator', administrator: @administrator %>");
|
||||||
1
app/views/admin/administrators/user_not_found.js.erb
Normal file
1
app/views/admin/administrators/user_not_found.js.erb
Normal file
@@ -0,0 +1 @@
|
|||||||
|
$("#search-result").html("<div class=\"small-12 column\"><div class=\"callout alert\"><%= j t('admin.administrators.search.user_not_found') %></div></div>");
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<td><%= geozone.name %></td>
|
<td><%= geozone.name %></td>
|
||||||
<td><%= geozone.external_code %></td>
|
<td><%= geozone.external_code %></td>
|
||||||
<td><%= geozone.census_code %></td>
|
<td><%= geozone.census_code %></td>
|
||||||
<td><%= geozone.html_map_coordinates %></td>
|
<td class="break"><%= geozone.html_map_coordinates %></td>
|
||||||
<td>
|
<td>
|
||||||
<%= link_to t("admin.geozones.index.edit"), edit_admin_geozone_path(geozone), class: 'edit-banner button hollow' %>
|
<%= link_to t("admin.geozones.index.edit"), edit_admin_geozone_path(geozone), class: 'edit-banner button hollow' %>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
3
app/views/admin/newsletters/index.html.erb
Normal file
3
app/views/admin/newsletters/index.html.erb
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<h2><%= t("admin.newsletters.index.title") %></h2>
|
||||||
|
|
||||||
|
<%= link_to t("admin.newsletters.index.button"), users_admin_newsletters_path, class: "button" %>
|
||||||
@@ -20,29 +20,29 @@
|
|||||||
<div class="row stats-numbers">
|
<div class="row stats-numbers">
|
||||||
<div class="small-12 medium-3 column">
|
<div class="small-12 medium-3 column">
|
||||||
<p class="featured">
|
<p class="featured">
|
||||||
<%= t "admin.stats.show.summary.visits" %><br>
|
<%= t "admin.stats.show.summary.visits" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@visits) %></span>
|
<span class="number"><%= number_with_delimiter(@visits) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.debates" %><br>
|
<%= t "admin.stats.show.summary.debates" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@debates) %></span>
|
<span class="number"><%= number_with_delimiter(@debates) %></span>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.proposals" %><br>
|
<%= t "admin.stats.show.summary.proposals" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@proposals) %></span>
|
<span class="number"><%= number_with_delimiter(@proposals) %></span>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.comments" %><br>
|
<%= t "admin.stats.show.summary.comments" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@comments) %></span>
|
<span class="number"><%= number_with_delimiter(@comments) %></span>
|
||||||
</p>
|
</p>
|
||||||
<% if feature?(:budgets) %>
|
<% if feature?(:budgets) %>
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.budgets" %><br>
|
<%= t "admin.stats.show.summary.budgets" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@budgets) %></span>
|
<span class="number"><%= number_with_delimiter(@budgets) %></span>
|
||||||
</p>
|
</p>
|
||||||
<p class="featured">
|
<p class="featured">
|
||||||
<%= t "admin.stats.show.summary.budget_investments" %><br>
|
<%= t "admin.stats.show.summary.budget_investments" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@investments) %></span>
|
<span class="number"><%= number_with_delimiter(@investments) %></span>
|
||||||
</p>
|
</p>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -50,56 +50,56 @@
|
|||||||
|
|
||||||
<div class="small-12 medium-3 column">
|
<div class="small-12 medium-3 column">
|
||||||
<p class="featured">
|
<p class="featured">
|
||||||
<%= t "admin.stats.show.summary.proposal_votes" %><br>
|
<%= t "admin.stats.show.summary.proposal_votes" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@proposal_votes) %><br></span>
|
<span class="number"><%= number_with_delimiter(@proposal_votes) %> <br></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.debate_votes" %><br>
|
<%= t "admin.stats.show.summary.debate_votes" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@debate_votes) %></span>
|
<span class="number"><%= number_with_delimiter(@debate_votes) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.comment_votes" %><br>
|
<%= t "admin.stats.show.summary.comment_votes" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@comment_votes) %></span>
|
<span class="number"><%= number_with_delimiter(@comment_votes) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.votes" %><br>
|
<%= t "admin.stats.show.summary.votes" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@votes) %></span>
|
<span class="number"><%= number_with_delimiter(@votes) %></span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="small-12 medium-3 column">
|
<div class="small-12 medium-3 column">
|
||||||
<p class="featured">
|
<p class="featured">
|
||||||
<%= t "admin.stats.show.summary.verified_users" %><br>
|
<%= t "admin.stats.show.summary.verified_users" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@verified_users) %></span>
|
<span class="number"><%= number_with_delimiter(@verified_users) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="featured">
|
<p class="featured">
|
||||||
<%= t "admin.stats.show.summary.unverified_users" %><br>
|
<%= t "admin.stats.show.summary.unverified_users" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@unverified_users) %></span>
|
<span class="number"><%= number_with_delimiter(@unverified_users) %></span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="small-12 medium-3 column">
|
<div class="small-12 medium-3 column">
|
||||||
<p class="featured">
|
<p class="featured">
|
||||||
<%= t "admin.stats.show.summary.users" %><br>
|
<%= t "admin.stats.show.summary.users" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@users) %></span>
|
<span class="number"><%= number_with_delimiter(@users) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.user_level_two" %><br>
|
<%= t "admin.stats.show.summary.user_level_two" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@user_level_two) %></span>
|
<span class="number"><%= number_with_delimiter(@user_level_two) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.user_level_three" %><br>
|
<%= t "admin.stats.show.summary.user_level_three" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@user_level_three) %></span>
|
<span class="number"><%= number_with_delimiter(@user_level_three) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t "admin.stats.show.summary.verified_users_who_didnt_vote_proposals" %><br>
|
<%= t "admin.stats.show.summary.verified_users_who_didnt_vote_proposals" %> <br>
|
||||||
<span class="number">
|
<span class="number">
|
||||||
<%=number_with_delimiter(@user_ids_who_didnt_vote_proposals)%>
|
<%=number_with_delimiter(@user_ids_who_didnt_vote_proposals)%>
|
||||||
</span>
|
</span>
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
<% if feature?(:spending_proposals) %>
|
<% if feature?(:spending_proposals) %>
|
||||||
<div class="small-12 medium-3 column">
|
<div class="small-12 medium-3 column">
|
||||||
<p class="featured">
|
<p class="featured">
|
||||||
<%= t "admin.stats.show.summary.spending_proposals" %><br>
|
<%= t "admin.stats.show.summary.spending_proposals" %> <br>
|
||||||
<span class="number"><%= number_with_delimiter(@spending_proposals) %></span>
|
<span class="number"><%= number_with_delimiter(@spending_proposals) %></span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -50,8 +50,9 @@
|
|||||||
signup: link_to(t("votes.signup"), new_user_registration_path),
|
signup: link_to(t("votes.signup"), new_user_registration_path),
|
||||||
my_heading: link_to(investment.heading.name,
|
my_heading: link_to(investment.heading.name,
|
||||||
budget_investments_path(budget_id: investment.budget_id,
|
budget_investments_path(budget_id: investment.budget_id,
|
||||||
heading_id: investment.heading_id))
|
heading_id: investment.heading_id)),
|
||||||
).html_safe %>
|
change_ballot: link_to(t("budgets.ballots.reasons_for_not_balloting.change_ballot"),
|
||||||
|
budget_ballot_path(@budget))).html_safe %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,12 @@
|
|||||||
@assigned_heading.name,
|
@assigned_heading.name,
|
||||||
budget_investments_path(@budget, heading_id: @assigned_heading.try(:id)))
|
budget_investments_path(@budget, heading_id: @assigned_heading.try(:id)))
|
||||||
) %>
|
) %>
|
||||||
|
<br>
|
||||||
|
<small>
|
||||||
|
<%= t("budgets.investments.header.change_ballot",
|
||||||
|
check_ballot: link_to(t("budgets.investments.header.check_ballot_link"),
|
||||||
|
budget_ballot_path(@budget))).html_safe %>
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="small-12 medium-9 column">
|
<div class="small-12 medium-9 column">
|
||||||
<%= back_link_to budget_investments_path(investment.budget) %>
|
<%= back_link_to budget_investments_path(investment.budget, heading_id: investment.heading) %>
|
||||||
|
|
||||||
<h1><%= investment.title %></h1>
|
<h1><%= investment.title %></h1>
|
||||||
|
|
||||||
|
|||||||
@@ -41,11 +41,19 @@
|
|||||||
</em>
|
</em>
|
||||||
</p>
|
</p>
|
||||||
<% elsif @assigned_heading.present? %>
|
<% elsif @assigned_heading.present? %>
|
||||||
<p><%= t("budgets.investments.index.sidebar.different_heading_assigned_html",
|
<p>
|
||||||
|
<%= t("budgets.investments.index.sidebar.different_heading_assigned_html",
|
||||||
heading_link: link_to(
|
heading_link: link_to(
|
||||||
@assigned_heading.name,
|
@assigned_heading.name,
|
||||||
budget_investments_path(@budget, heading_id: @assigned_heading.try(:id)))
|
budget_investments_path(@budget, heading_id: @assigned_heading.try(:id)))
|
||||||
) %></p>
|
) %>
|
||||||
|
<br>
|
||||||
|
<small>
|
||||||
|
<%= t("budgets.investments.index.sidebar.change_ballot",
|
||||||
|
check_ballot: link_to(t("budgets.investments.index.sidebar.check_ballot_link"),
|
||||||
|
budget_ballot_path(@budget))).html_safe %>
|
||||||
|
</small>
|
||||||
|
</p>
|
||||||
<% else %>
|
<% else %>
|
||||||
<p><strong><%= t("budgets.investments.index.sidebar.zero") %></strong></p>
|
<p><strong><%= t("budgets.investments.index.sidebar.zero") %></strong></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<%= render 'layouts/admin_header' %>
|
<%= render 'layouts/admin_header' %>
|
||||||
|
|
||||||
<div class="no-margin-top row no-max-width collapse" data-equalizer>
|
<div class="no-margin-top row no-max-width collapse" data-equalizer>
|
||||||
<div class="small-12 medium-3 column">
|
<div class="small-12 medium-3 column" data-equalizer-watch>
|
||||||
|
|
||||||
<div class="show-for-small-only">
|
<div class="show-for-small-only">
|
||||||
<button type="button" class="button hollow expanded" data-toggle="offCanvas"><%= t("admin.menu.admin") %></button>
|
<button type="button" class="button hollow expanded" data-toggle="offCanvas"><%= t("admin.menu.admin") %></button>
|
||||||
|
|||||||
@@ -340,8 +340,10 @@ en:
|
|||||||
hidden_debates: Hidden debates
|
hidden_debates: Hidden debates
|
||||||
hidden_proposals: Hidden proposals
|
hidden_proposals: Hidden proposals
|
||||||
hidden_users: Hidden users
|
hidden_users: Hidden users
|
||||||
|
administrators: Administrators
|
||||||
managers: Managers
|
managers: Managers
|
||||||
moderators: Moderators
|
moderators: Moderators
|
||||||
|
newsletter: Newsletters
|
||||||
valuators: Valuators
|
valuators: Valuators
|
||||||
poll_officers: Poll officers
|
poll_officers: Poll officers
|
||||||
polls: Polls
|
polls: Polls
|
||||||
@@ -364,6 +366,17 @@ en:
|
|||||||
title_banners: Banners
|
title_banners: Banners
|
||||||
title_site_customization: Site customization
|
title_site_customization: Site customization
|
||||||
legislation: Collaborative Legislation
|
legislation: Collaborative Legislation
|
||||||
|
administrators:
|
||||||
|
index:
|
||||||
|
title: Administrators
|
||||||
|
administrator:
|
||||||
|
add: Add
|
||||||
|
delete: Delete
|
||||||
|
restricted_removal: "Sorry, you can't remove yourself from the administrators"
|
||||||
|
search:
|
||||||
|
email_placeholder: Search user by email
|
||||||
|
search: Search
|
||||||
|
user_not_found: User not found
|
||||||
moderators:
|
moderators:
|
||||||
index:
|
index:
|
||||||
title: Moderators
|
title: Moderators
|
||||||
@@ -374,6 +387,10 @@ en:
|
|||||||
email_placeholder: Search user by email
|
email_placeholder: Search user by email
|
||||||
search: Search
|
search: Search
|
||||||
user_not_found: User not found
|
user_not_found: User not found
|
||||||
|
newsletters:
|
||||||
|
index:
|
||||||
|
title: Newsletters
|
||||||
|
button: Download zip with users list
|
||||||
valuators:
|
valuators:
|
||||||
index:
|
index:
|
||||||
title: Valuators
|
title: Valuators
|
||||||
@@ -629,7 +646,7 @@ en:
|
|||||||
placeholder: Search spending proposals by title or description
|
placeholder: Search spending proposals by title or description
|
||||||
user_search:
|
user_search:
|
||||||
button: Search
|
button: Search
|
||||||
placeholder: Search user by name or email'
|
placeholder: Search user by name or email
|
||||||
search_results: "Search results"
|
search_results: "Search results"
|
||||||
no_search_results: "No results found."
|
no_search_results: "No results found."
|
||||||
spending_proposals:
|
spending_proposals:
|
||||||
|
|||||||
@@ -318,6 +318,17 @@ es:
|
|||||||
comments_count: Número de comentarios
|
comments_count: Número de comentarios
|
||||||
question_option_fields:
|
question_option_fields:
|
||||||
remove_option: Eliminar
|
remove_option: Eliminar
|
||||||
|
administrators:
|
||||||
|
index:
|
||||||
|
title: Administradores
|
||||||
|
administrator:
|
||||||
|
add: Añadir como Administrador
|
||||||
|
delete: Borrar
|
||||||
|
restricted_removal: "Lo sentimos, no puedes eliminarte a ti mismo de la lista"
|
||||||
|
search:
|
||||||
|
email_placeholder: Buscar usuario por email
|
||||||
|
search: Buscar
|
||||||
|
user_not_found: Usuario no encontrado
|
||||||
managers:
|
managers:
|
||||||
index:
|
index:
|
||||||
title: Gestores
|
title: Gestores
|
||||||
@@ -341,7 +352,9 @@ es:
|
|||||||
hidden_proposals: Propuestas ocultas
|
hidden_proposals: Propuestas ocultas
|
||||||
hidden_users: Usuarios bloqueados
|
hidden_users: Usuarios bloqueados
|
||||||
managers: Gestores
|
managers: Gestores
|
||||||
|
administrators: Administradores
|
||||||
moderators: Moderadores
|
moderators: Moderadores
|
||||||
|
newsletter: Envío de Newsletters
|
||||||
valuators: Evaluadores
|
valuators: Evaluadores
|
||||||
poll_officers: Presidentes de mesa
|
poll_officers: Presidentes de mesa
|
||||||
polls: Votaciones
|
polls: Votaciones
|
||||||
@@ -374,6 +387,10 @@ es:
|
|||||||
email_placeholder: Buscar usuario por email
|
email_placeholder: Buscar usuario por email
|
||||||
search: Buscar
|
search: Buscar
|
||||||
user_not_found: Usuario no encontrado
|
user_not_found: Usuario no encontrado
|
||||||
|
newsletters:
|
||||||
|
index:
|
||||||
|
title: Envío de newsletters
|
||||||
|
button: Descargar zip con lista de usuarios
|
||||||
valuators:
|
valuators:
|
||||||
index:
|
index:
|
||||||
title: Evaluadores
|
title: Evaluadores
|
||||||
|
|||||||
@@ -17,9 +17,10 @@ en:
|
|||||||
not_verified: Only verified users can vote on investments; %{verify_account}.
|
not_verified: Only verified users can vote on investments; %{verify_account}.
|
||||||
organization: Organizations are not permitted to vote
|
organization: Organizations are not permitted to vote
|
||||||
not_selected: Unselected investment projects can not be supported
|
not_selected: Unselected investment projects can not be supported
|
||||||
not_enough_money: "Price is higher than the available amount left."
|
not_enough_money_html: "You have already assigned the available budget.<br><small>Remember you can %{change_ballot} at any time</small>"
|
||||||
no_ballots_allowed: Selecting phase is closed
|
no_ballots_allowed: Selecting phase is closed
|
||||||
different_heading_assigned: You have already voted a different heading
|
different_heading_assigned: You have already voted a different heading
|
||||||
|
change_ballot: change your votes
|
||||||
groups:
|
groups:
|
||||||
show:
|
show:
|
||||||
title: Select an option
|
title: Select an option
|
||||||
@@ -64,6 +65,8 @@ en:
|
|||||||
voted_info: You can %{link} at any time until the close of this phase. No need to spend all the money available.
|
voted_info: You can %{link} at any time until the close of this phase. No need to spend all the money available.
|
||||||
voted_info_link: change your vote
|
voted_info_link: change your vote
|
||||||
different_heading_assigned_html: "You have active votes in another heading: %{heading_link}"
|
different_heading_assigned_html: "You have active votes in another heading: %{heading_link}"
|
||||||
|
change_ballot: "If your change your mind you can remove your votes in %{check_ballot} and start again."
|
||||||
|
check_ballot_link: "check my ballot"
|
||||||
zero: You have not voted any investment project in this group.
|
zero: You have not voted any investment project in this group.
|
||||||
verified_only: "To create a new budget investment %{verify}."
|
verified_only: "To create a new budget investment %{verify}."
|
||||||
verify_account: "verify your account"
|
verify_account: "verify your account"
|
||||||
@@ -106,6 +109,8 @@ en:
|
|||||||
header:
|
header:
|
||||||
check_ballot: Check my ballot
|
check_ballot: Check my ballot
|
||||||
different_heading_assigned_html: "You have active votes in another heading: %{heading_link}"
|
different_heading_assigned_html: "You have active votes in another heading: %{heading_link}"
|
||||||
|
change_ballot: "If your change your mind you can remove your votes in %{check_ballot} and start again."
|
||||||
|
check_ballot_link: "check my ballot"
|
||||||
progress_bar:
|
progress_bar:
|
||||||
available: "Available: "
|
available: "Available: "
|
||||||
show:
|
show:
|
||||||
|
|||||||
@@ -17,9 +17,10 @@ es:
|
|||||||
not_verified: Las propuestas de inversión sólo pueden ser apoyadas por usuarios verificados, %{verify_account}.
|
not_verified: Las propuestas de inversión sólo pueden ser apoyadas por usuarios verificados, %{verify_account}.
|
||||||
organization: Las organizaciones no pueden votar.
|
organization: Las organizaciones no pueden votar.
|
||||||
not_selected: No se pueden votar propuestas inviables.
|
not_selected: No se pueden votar propuestas inviables.
|
||||||
not_enough_money: No hay fondos suficientes.
|
not_enough_money_html: "Ya has asignado el presupuesto disponible.<br><small>Recuerda que puedes %{change_ballot} en cualquier momento</small>"
|
||||||
no_ballots_allowed: El periodo de votación está cerrado.
|
no_ballots_allowed: El periodo de votación está cerrado.
|
||||||
different_heading_assigned: Ya votaste en una sección distinta del presupuesto.
|
different_heading_assigned: Ya votaste en una sección distinta del presupuesto.
|
||||||
|
change_ballot: cambiar tus votos
|
||||||
groups:
|
groups:
|
||||||
show:
|
show:
|
||||||
title: Selecciona una opción
|
title: Selecciona una opción
|
||||||
@@ -64,6 +65,8 @@ es:
|
|||||||
voted_info: Puedes %{link} en cualquier momento hasta el cierre de esta fase. No hace falta que gastes todo el dinero disponible.
|
voted_info: Puedes %{link} en cualquier momento hasta el cierre de esta fase. No hace falta que gastes todo el dinero disponible.
|
||||||
voted_info_link: cambiar tus votos
|
voted_info_link: cambiar tus votos
|
||||||
different_heading_assigned_html: "Ya apoyaste propuestas de otra sección del presupuesto: %{heading_link}"
|
different_heading_assigned_html: "Ya apoyaste propuestas de otra sección del presupuesto: %{heading_link}"
|
||||||
|
change_ballot: "Si cambias de opinión puedes borrar tus votos en %{check_ballot} y volver a empezar."
|
||||||
|
check_ballot_link: "revisar mis votos"
|
||||||
zero: "Todavía no has votado ninguna propuesta de inversión en este ámbito del presupuesto."
|
zero: "Todavía no has votado ninguna propuesta de inversión en este ámbito del presupuesto."
|
||||||
verified_only: "Para crear una nueva propuesta de inversión %{verify}."
|
verified_only: "Para crear una nueva propuesta de inversión %{verify}."
|
||||||
verify_account: "verifica tu cuenta"
|
verify_account: "verifica tu cuenta"
|
||||||
@@ -106,6 +109,8 @@ es:
|
|||||||
header:
|
header:
|
||||||
check_ballot: Revisar mis votos
|
check_ballot: Revisar mis votos
|
||||||
different_heading_assigned_html: "Ya apoyaste propuestas de otra sección del presupuesto: %{heading_link}"
|
different_heading_assigned_html: "Ya apoyaste propuestas de otra sección del presupuesto: %{heading_link}"
|
||||||
|
change_ballot: "Si cambias de opinión puedes borrar tus votos en %{check_ballot} y volver a empezar."
|
||||||
|
check_ballot_link: "revisar mis votos"
|
||||||
progress_bar:
|
progress_bar:
|
||||||
available: "Disponible: "
|
available: "Disponible: "
|
||||||
show:
|
show:
|
||||||
|
|||||||
@@ -233,6 +233,10 @@ Rails.application.routes.draw do
|
|||||||
get :search, on: :collection
|
get :search, on: :collection
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resources :administrators, only: [:index, :create, :destroy] do
|
||||||
|
get :search, on: :collection
|
||||||
|
end
|
||||||
|
|
||||||
scope module: :poll do
|
scope module: :poll do
|
||||||
resources :polls do
|
resources :polls do
|
||||||
get :search_questions, on: :member
|
get :search_questions, on: :member
|
||||||
@@ -265,6 +269,9 @@ Rails.application.routes.draw do
|
|||||||
end
|
end
|
||||||
|
|
||||||
resource :activity, controller: :activity, only: :show
|
resource :activity, controller: :activity, only: :show
|
||||||
|
resources :newsletters, only: :index do
|
||||||
|
get :users, on: :collection
|
||||||
|
end
|
||||||
resource :stats, only: :show do
|
resource :stats, only: :show do
|
||||||
get :proposal_notifications, on: :collection
|
get :proposal_notifications, on: :collection
|
||||||
get :direct_messages, on: :collection
|
get :direct_messages, on: :collection
|
||||||
|
|||||||
@@ -408,7 +408,7 @@ tags = Faker::Lorem.words(10)
|
|||||||
title: Faker::Lorem.sentence(3).truncate(60),
|
title: Faker::Lorem.sentence(3).truncate(60),
|
||||||
external_url: Faker::Internet.url,
|
external_url: Faker::Internet.url,
|
||||||
description: "<p>#{Faker::Lorem.paragraphs.join('</p><p>')}</p>",
|
description: "<p>#{Faker::Lorem.paragraphs.join('</p><p>')}</p>",
|
||||||
created_at: rand((Time.now - 1.week) .. Time.now),
|
created_at: rand((Time.current - 1.week) .. Time.current),
|
||||||
feasibility: %w{undecided unfeasible feasible feasible feasible feasible}.sample,
|
feasibility: %w{undecided unfeasible feasible feasible feasible feasible}.sample,
|
||||||
unfeasibility_explanation: Faker::Lorem.paragraph,
|
unfeasibility_explanation: Faker::Lorem.paragraph,
|
||||||
valuation_finished: [false, true].sample,
|
valuation_finished: [false, true].sample,
|
||||||
@@ -437,7 +437,7 @@ budget = Budget.where(phase: "finished").last
|
|||||||
title: Faker::Lorem.sentence(3).truncate(60),
|
title: Faker::Lorem.sentence(3).truncate(60),
|
||||||
external_url: Faker::Internet.url,
|
external_url: Faker::Internet.url,
|
||||||
description: "<p>#{Faker::Lorem.paragraphs.join('</p><p>')}</p>",
|
description: "<p>#{Faker::Lorem.paragraphs.join('</p><p>')}</p>",
|
||||||
created_at: rand((Time.now - 1.week) .. Time.now),
|
created_at: rand((Time.current - 1.week) .. Time.current),
|
||||||
feasibility: "feasible",
|
feasibility: "feasible",
|
||||||
valuation_finished: true,
|
valuation_finished: true,
|
||||||
selected: true,
|
selected: true,
|
||||||
|
|||||||
@@ -98,6 +98,12 @@ brew install ghostscript
|
|||||||
brew install phantomjs
|
brew install phantomjs
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Imagemagick
|
||||||
|
|
||||||
|
```
|
||||||
|
brew install imagemagick
|
||||||
|
```
|
||||||
|
|
||||||
## Cloning the repository
|
## Cloning the repository
|
||||||
|
|
||||||
Now that we have all the dependencies installed we can download the repository:
|
Now that we have all the dependencies installed we can download the repository:
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
## Linux
|
## Linux
|
||||||
|
|
||||||
|
Consultar [aqui](dev_test_setup_linux.md)
|
||||||
|
|
||||||
## Mac OS X
|
## Mac OS X
|
||||||
|
|
||||||
Consultar [aquí](dev_test_setup_osx.md)
|
Consultar [aquí](dev_test_setup_osx.md)
|
||||||
|
|||||||
146
doc/es/dev_test_setup_linux.md
Normal file
146
doc/es/dev_test_setup_linux.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# Configuración para los entornos de desarrollo y pruebas (GNU/Linux)
|
||||||
|
|
||||||
|
## Git
|
||||||
|
|
||||||
|
Git es mantenido oficialmente en Debian/Ubuntu:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt-get install git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ruby
|
||||||
|
|
||||||
|
Las versiones de Ruby versions empaquetadas en repositorios oficiales no son aptas para trabajar con consul (al menos Debian 7 y 8), así que debemos instalar manualmente.
|
||||||
|
|
||||||
|
El método recomendado es via rvm:
|
||||||
|
|
||||||
|
(sólo la opción multiusuario instala todas las dependencias automáticamente, al usar 'sudo'.)
|
||||||
|
|
||||||
|
###como usuario local:
|
||||||
|
|
||||||
|
```
|
||||||
|
curl -L https://get.rvm.io | bash -s stable
|
||||||
|
```
|
||||||
|
###para todos los usuarios del sistema:
|
||||||
|
|
||||||
|
```
|
||||||
|
curl -L https://get.rvm.io | sudo bash -s stable
|
||||||
|
```
|
||||||
|
|
||||||
|
añadismos nuestro usuario al grupo de rvm
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo usermod -a -G rvm <user>
|
||||||
|
```
|
||||||
|
|
||||||
|
y finalmente, añadimos el script rvm a nuestro bash (~/.bashrc) (este paso sólo es necesario si no puedes ejecutar el comando rvm)
|
||||||
|
|
||||||
|
```
|
||||||
|
[[ -s /usr/local/rvm/scripts/rvm ]] && source /usr/local/rvm/scripts/rvm
|
||||||
|
```
|
||||||
|
|
||||||
|
con todo esto, deberías poder instalar la versión de ruby con rvm, por ejemplo la 2.3.2:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo rvm install 2.3.2
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bundler
|
||||||
|
|
||||||
|
usando
|
||||||
|
|
||||||
|
```
|
||||||
|
gem install bundler
|
||||||
|
```
|
||||||
|
|
||||||
|
hay varios métodos alternativos [aquí](https://rvm.io/integration/bundler) que podrían ser mejores como:
|
||||||
|
|
||||||
|
```
|
||||||
|
gem install rubygems-bundler
|
||||||
|
```
|
||||||
|
|
||||||
|
## PostgreSQL (>=9.4)
|
||||||
|
|
||||||
|
La versión 9.4 de PostgreSQL no es oficial en Debian 7 (wheezy), pero en Debian 8 parece ser mantenida oficialmente.
|
||||||
|
|
||||||
|
Así que debemos añadir el respositorio oficial de postgresql a apt, por ejemplo creando el fichero */etc/apt/sources.list.d/pgdg.list* con:
|
||||||
|
|
||||||
|
```
|
||||||
|
deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main
|
||||||
|
```
|
||||||
|
|
||||||
|
después deberás descargar la key e instalarla:
|
||||||
|
|
||||||
|
```
|
||||||
|
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
|
||||||
|
apt-key add ACCC4CF8.asc
|
||||||
|
```
|
||||||
|
|
||||||
|
y finalmente instalar postgresql
|
||||||
|
|
||||||
|
```
|
||||||
|
apt-get update
|
||||||
|
apt-get install postgresql-9.4
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ghostscript
|
||||||
|
|
||||||
|
```
|
||||||
|
apt-get install ghostscript
|
||||||
|
```
|
||||||
|
|
||||||
|
## Clonar el repositorio
|
||||||
|
|
||||||
|
Ahora que ya tenemos todas las dependencias instalado podemos bajarnos el proyecto:
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/consul/consul.git
|
||||||
|
cd consul
|
||||||
|
bundle install
|
||||||
|
cp config/database.yml.example config/database.yml
|
||||||
|
cp config/secrets.yml.example config/secrets.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
Ahora copia en `database.yml` el usuario y la contraseña que pusiste para *consul*. Cuando ya lo hayas hecho:
|
||||||
|
|
||||||
|
```
|
||||||
|
rake db:create
|
||||||
|
rake db:setup
|
||||||
|
rake db:dev_seed
|
||||||
|
RAILS_ENV=test bin/rake db:setup
|
||||||
|
```
|
||||||
|
|
||||||
|
Para ejecutar los tests:
|
||||||
|
|
||||||
|
```
|
||||||
|
bundle exec rspec
|
||||||
|
```
|
||||||
|
|
||||||
|
Quizás necesites crear un rol de superusuario en postgresql, y completar en el fichero*/config/database.yml* los campos 'user:' y 'password:'.
|
||||||
|
|
||||||
|
Además, parece que postgresql usa un socket unix por defecto para las comunicaciones en local. Si te encuentras este problema creando la base de datos, cambia en */config/database.yml* la linea:
|
||||||
|
|
||||||
|
```
|
||||||
|
host: localhost
|
||||||
|
```
|
||||||
|
|
||||||
|
por:
|
||||||
|
|
||||||
|
```
|
||||||
|
host: /var/run/postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
Tras esto en el terminal ejecutaremos:
|
||||||
|
|
||||||
|
```
|
||||||
|
rake db:create
|
||||||
|
rake db:setup
|
||||||
|
rake db:dev_seed
|
||||||
|
RAILS_ENV=test bin/rake db:setup
|
||||||
|
```
|
||||||
|
|
||||||
|
Y por último para comprobar que todo esta bien, lanza los tests:
|
||||||
|
|
||||||
|
```
|
||||||
|
bundle exec rspec
|
||||||
|
```
|
||||||
@@ -100,6 +100,12 @@ brew install ghostscript
|
|||||||
brew install phantomjs
|
brew install phantomjs
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Imagemagick
|
||||||
|
|
||||||
|
```
|
||||||
|
brew install imagemagick
|
||||||
|
```
|
||||||
|
|
||||||
## Clonar el repositorio
|
## Clonar el repositorio
|
||||||
|
|
||||||
Ahora que ya tenemos todas las dependencias instalado podemos bajarnos el proyecto:
|
Ahora que ya tenemos todas las dependencias instalado podemos bajarnos el proyecto:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
module Age
|
module Age
|
||||||
def self.in_years(dob, now = Time.now.utc.to_date)
|
def self.in_years(dob, now = Time.current.to_date)
|
||||||
return nil unless dob.present?
|
return nil unless dob.present?
|
||||||
# reference: http://stackoverflow.com/questions/819263/get-persons-age-in-ruby#comment21200772_819263
|
# reference: http://stackoverflow.com/questions/819263/get-persons-age-in-ruby#comment21200772_819263
|
||||||
now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
|
now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
|
||||||
|
|||||||
25
lib/newsletter_zip.rb
Normal file
25
lib/newsletter_zip.rb
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
require 'zip'
|
||||||
|
class NewsletterZip
|
||||||
|
attr_accessor :filename
|
||||||
|
|
||||||
|
def initialize(filename)
|
||||||
|
@filename = filename
|
||||||
|
end
|
||||||
|
|
||||||
|
def emails
|
||||||
|
User.newsletter.pluck(:email).join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
def path
|
||||||
|
Rails.root + "/tmp/#{filename}.zip"
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
Zip::File.open(path, Zip::File::CREATE) do |zipfile|
|
||||||
|
zipfile.get_output_stream("#{filename}.txt") do |file|
|
||||||
|
file.write emails
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -388,7 +388,7 @@ FactoryGirl.define do
|
|||||||
end
|
end
|
||||||
|
|
||||||
factory :poll do
|
factory :poll do
|
||||||
sequence(:name) { |n| "Poll #{n}" }
|
sequence(:name) { |n| "Poll #{SecureRandom.hex}" }
|
||||||
|
|
||||||
starts_at { 1.month.ago }
|
starts_at { 1.month.ago }
|
||||||
ends_at { 1.month.from_now }
|
ends_at { 1.month.from_now }
|
||||||
|
|||||||
45
spec/features/admin/administrators_spec.rb
Normal file
45
spec/features/admin/administrators_spec.rb
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
feature 'Admin administrators' do
|
||||||
|
background do
|
||||||
|
@admin = create(:administrator)
|
||||||
|
@user = create(:user, username: 'Jose Luis Balbin')
|
||||||
|
@administrator = create(:administrator)
|
||||||
|
login_as(@admin.user)
|
||||||
|
visit admin_administrators_path
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'Index' do
|
||||||
|
expect(page).to have_content @administrator.name
|
||||||
|
expect(page).to have_content @administrator.email
|
||||||
|
expect(page).to_not have_content @user.name
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'Create Administrator', :js do
|
||||||
|
fill_in 'email', with: @user.email
|
||||||
|
click_button 'Search'
|
||||||
|
|
||||||
|
expect(page).to have_content @user.name
|
||||||
|
click_link 'Add'
|
||||||
|
within("#administrators") do
|
||||||
|
expect(page).to have_content @user.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'Delete Administrator' do
|
||||||
|
find(:xpath, "//tr[contains(.,'#{@administrator.name}')]/td/a", text: 'Delete').click
|
||||||
|
|
||||||
|
within("#administrators") do
|
||||||
|
expect(page).to_not have_content @administrator.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'Delete Administrator when its the current user' do
|
||||||
|
find(:xpath, "//tr[contains(.,'#{@admin.name}')]/td/a", text: 'Delete').click
|
||||||
|
|
||||||
|
within("#error") do
|
||||||
|
expect(page).to have_content I18n.t("admin.administrators.administrator.restricted_removal")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
26
spec/features/admin/newsletters_spec.rb
Normal file
26
spec/features/admin/newsletters_spec.rb
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
feature 'Admin newsletters emails' do
|
||||||
|
|
||||||
|
let(:download_button_text) { 'Download zip with users list' }
|
||||||
|
|
||||||
|
background do
|
||||||
|
@admin = create(:administrator)
|
||||||
|
@newsletter_user = create(:user, newsletter: true)
|
||||||
|
@non_newsletter_user = create(:user, newsletter: false)
|
||||||
|
login_as(@admin.user)
|
||||||
|
visit admin_newsletters_path
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'Index' do
|
||||||
|
expect(page).to have_content download_button_text
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'Download newsletter email zip' do
|
||||||
|
click_link download_button_text
|
||||||
|
downloaded_file_content = Zip::InputStream.open(StringIO.new(page.body)).get_next_entry.get_input_stream {|is| is.read }
|
||||||
|
expect(downloaded_file_content).to include(@admin.user.email, @newsletter_user.email)
|
||||||
|
expect(downloaded_file_content).not_to include(@non_newsletter_user.email)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@@ -536,7 +536,7 @@ feature 'Ballots' do
|
|||||||
|
|
||||||
within("#budget_investment_#{bi2.id}") do
|
within("#budget_investment_#{bi2.id}") do
|
||||||
find("div.ballot").hover
|
find("div.ballot").hover
|
||||||
expect(page).to have_content('Price is higher than the available amount left')
|
expect(page).to have_content('You have already assigned the available budget')
|
||||||
expect(page).to have_selector('.in-favor a', visible: false)
|
expect(page).to have_selector('.in-favor a', visible: false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -550,7 +550,7 @@ feature 'Ballots' do
|
|||||||
|
|
||||||
within("#budget_investment_#{bi1.id}") do
|
within("#budget_investment_#{bi1.id}") do
|
||||||
find("div.ballot").hover
|
find("div.ballot").hover
|
||||||
expect(page).to_not have_content('Price is higher than the available amount left')
|
expect(page).to_not have_content('You have already assigned the available budget')
|
||||||
expect(page).to have_selector('.in-favor a', visible: true)
|
expect(page).to have_selector('.in-favor a', visible: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -558,7 +558,7 @@ feature 'Ballots' do
|
|||||||
|
|
||||||
within("#budget_investment_#{bi2.id}") do
|
within("#budget_investment_#{bi2.id}") do
|
||||||
find("div.ballot").trigger("mouseover")
|
find("div.ballot").trigger("mouseover")
|
||||||
expect(page).to have_content('Price is higher than the available amount left')
|
expect(page).to have_content('You have already assigned the available budget')
|
||||||
expect(page).to have_selector('.in-favor a', visible: false)
|
expect(page).to have_selector('.in-favor a', visible: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -576,7 +576,7 @@ feature 'Ballots' do
|
|||||||
|
|
||||||
within("#budget_investment_#{bi2.id}") do
|
within("#budget_investment_#{bi2.id}") do
|
||||||
find("div.ballot").hover
|
find("div.ballot").hover
|
||||||
expect(page).to have_content('Price is higher than the available amount left')
|
expect(page).to have_content('You have already assigned the available budget')
|
||||||
expect(page).to have_selector('.in-favor a', visible: false)
|
expect(page).to have_selector('.in-favor a', visible: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -587,7 +587,7 @@ feature 'Ballots' do
|
|||||||
|
|
||||||
within("#budget_investment_#{bi2.id}") do
|
within("#budget_investment_#{bi2.id}") do
|
||||||
find("div.ballot").hover
|
find("div.ballot").hover
|
||||||
expect(page).to_not have_content('Price is higher than the available amount left')
|
expect(page).to_not have_content('You have already assigned the available budget')
|
||||||
expect(page).to have_selector('.in-favor a', visible: true)
|
expect(page).to have_selector('.in-favor a', visible: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -604,7 +604,7 @@ feature 'Ballots' do
|
|||||||
|
|
||||||
within("#budget_investment_#{bi2.id}") do
|
within("#budget_investment_#{bi2.id}") do
|
||||||
find("div.ballot").hover
|
find("div.ballot").hover
|
||||||
expect(page).to have_content('Price is higher than the available amount left')
|
expect(page).to have_content('You have already assigned the available budget')
|
||||||
expect(page).to have_selector('.in-favor a', visible: false)
|
expect(page).to have_selector('.in-favor a', visible: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -616,7 +616,7 @@ feature 'Ballots' do
|
|||||||
|
|
||||||
within("#budget_investment_#{bi2.id}") do
|
within("#budget_investment_#{bi2.id}") do
|
||||||
find("div.ballot").hover
|
find("div.ballot").hover
|
||||||
expect(page).to_not have_content('Price is higher than the available amount left')
|
expect(page).to_not have_content('You have already assigned the available budget')
|
||||||
expect(page).to have_selector('.in-favor a', visible: true)
|
expect(page).to have_selector('.in-favor a', visible: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -278,6 +278,13 @@ feature 'Budget Investments' do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario "Show back link contains heading id" do
|
||||||
|
investment = create(:budget_investment, heading: heading)
|
||||||
|
visit budget_investment_path(budget, investment)
|
||||||
|
|
||||||
|
expect(page).to have_link "Go back", href: budget_investments_path(budget, heading_id: investment.heading)
|
||||||
|
end
|
||||||
|
|
||||||
context "Show (feasible budget investment)" do
|
context "Show (feasible budget investment)" do
|
||||||
let(:investment) { create(:budget_investment,
|
let(:investment) { create(:budget_investment,
|
||||||
:feasible,
|
:feasible,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ require 'rails_helper'
|
|||||||
feature 'Votes' do
|
feature 'Votes' do
|
||||||
|
|
||||||
background do
|
background do
|
||||||
@manuela = create(:user, verified_at: Time.now)
|
@manuela = create(:user, verified_at: Time.current)
|
||||||
end
|
end
|
||||||
|
|
||||||
feature 'Investments' do
|
feature 'Investments' do
|
||||||
|
|||||||
@@ -712,7 +712,7 @@ describe Budget::Investment do
|
|||||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||||
ballot.investments << inv1
|
ballot.investments << inv1
|
||||||
|
|
||||||
expect(inv2.reason_for_not_being_ballotable_by(user, ballot)).to eq(:not_enough_money)
|
expect(inv2.reason_for_not_being_ballotable_by(user, ballot)).to eq(:not_enough_money_html)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -65,9 +65,9 @@ describe DirectMessage do
|
|||||||
|
|
||||||
describe "today" do
|
describe "today" do
|
||||||
it "should return direct messages created today" do
|
it "should return direct messages created today" do
|
||||||
direct_message1 = create(:direct_message, created_at: Time.zone.now.beginning_of_day + 3.hours)
|
direct_message1 = create(:direct_message, created_at: Time.current.beginning_of_day + 3.hours)
|
||||||
direct_message2 = create(:direct_message, created_at: Time.zone.now)
|
direct_message2 = create(:direct_message, created_at: Time.current)
|
||||||
direct_message3 = create(:direct_message, created_at: Time.zone.now.end_of_day)
|
direct_message3 = create(:direct_message, created_at: Time.current.end_of_day)
|
||||||
|
|
||||||
expect(DirectMessage.today.count).to eq 3
|
expect(DirectMessage.today.count).to eq 3
|
||||||
end
|
end
|
||||||
@@ -82,4 +82,4 @@ describe DirectMessage do
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -23,18 +23,21 @@ describe :recount do
|
|||||||
expect(recount.count_log).to eq("")
|
expect(recount.count_log).to eq("")
|
||||||
|
|
||||||
recount.count = 33
|
recount.count = 33
|
||||||
recount.officer_assignment = create(:poll_officer_assignment, id: 11)
|
poll_officer_assignment_1 = create(:poll_officer_assignment)
|
||||||
|
recount.officer_assignment = poll_officer_assignment_1
|
||||||
recount.save
|
recount.save
|
||||||
|
|
||||||
recount.count = 32
|
recount.count = 32
|
||||||
recount.officer_assignment = create(:poll_officer_assignment, id: 12)
|
poll_officer_assignment_2 = create(:poll_officer_assignment)
|
||||||
|
recount.officer_assignment = poll_officer_assignment_2
|
||||||
recount.save
|
recount.save
|
||||||
|
|
||||||
recount.count = 34
|
recount.count = 34
|
||||||
recount.officer_assignment = create(:poll_officer_assignment, id: 13)
|
poll_officer_assignment_3 = create(:poll_officer_assignment)
|
||||||
|
recount.officer_assignment = poll_officer_assignment_3
|
||||||
recount.save
|
recount.save
|
||||||
|
|
||||||
expect(recount.officer_assignment_id_log).to eq(":11:12")
|
expect(recount.officer_assignment_id_log).to eq(":#{poll_officer_assignment_1.id}:#{poll_officer_assignment_2.id}")
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user