Fixes conflicts. Merge branch 'master' into ancestry

This commit is contained in:
Juanjo Bazán
2015-09-03 16:37:28 +02:00
94 changed files with 1062 additions and 673 deletions

View File

@@ -16,6 +16,7 @@
// 14. Tables
// 15. Social
// 16. Pages
// 17. Verification
//
// 01. Variables
@@ -126,6 +127,7 @@ h6 {
}
.button {
font-size: rem-calc(13);
padding: rem-calc(15) rem-calc(32);
}
@@ -221,6 +223,11 @@ h6 {
}
}
.progress {
background-color: rgba(0,0,0,.06);
border: 0;
}
// 04. Header
// - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -229,7 +236,7 @@ header {
background-position: 50% 50%;
background-size: cover;
color: $text;
min-height: rem-calc(600);
min-height: rem-calc(624);
&.results {
min-height: rem-calc(48);
@@ -543,9 +550,14 @@ footer {
a {
color: white;
&.link:hover {
&:hover {
color: white;
opacity: .5;
transition: opacity 275ms;
}
&:active, &:focus {
color: white;
}
}
@@ -554,7 +566,14 @@ footer {
text-decoration: underline;
&:hover {
color: rgba(255,255,255,.6);
color: white;
opacity: .5;
transition: opacity 275ms;
}
&:active, &:focus {
color: white;
opacity: 1;
}
}
}
@@ -752,6 +771,13 @@ form {
}
}
.captcha {
label {
display: none;
}
}
// 09. Alerts
// - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -847,22 +873,8 @@ form {
margin-right: rem-calc(12);
}
.date {
select {
float: left;
width: 25%;
}
}
.verify-account {
padding-right: rem-calc(12);
.verified {
color: $check;
font-weight: bold;
line-height: rem-calc(42);
}
}
}
@@ -1122,13 +1134,23 @@ table {
.page {
background: white;
min-height: 100%;
min-height: rem-calc(600);
.menu {
margin-top: rem-calc(24);
ul {
list-style-type: none;
margin-left: 0;
& ul {
margin-left: rem-calc(12);
}
}
a {
display: block;
font-size: rem-calc(13);
margin-bottom: rem-calc(12);
}
}
@@ -1137,7 +1159,12 @@ table {
margin-top: rem-calc(24);
text-align: justify;
ul {
h1, h2, h3, h4, h5, h6 {
text-align: left;
}
ul, ol {
margin-left: rem-calc(12);
li {
font-size: rem-calc(13);
@@ -1147,7 +1174,91 @@ table {
}
}
// 17. Verification
// - - - - - - - - - - - - - - - - - - - - - - - - -
.verification {
min-height: 60%;
@media (min-width: $small-breakpoint) {
.left + .left {
margin-left: rem-calc(12);
}
}
.verify-account {
padding-right: rem-calc(12);
.verified {
color: $check;
font-weight: bold;
line-height: rem-calc(42);
}
}
.date {
select {
float: left;
width: 30%;
@media (min-width: $small-breakpoint) {
width: 25%;
}
}
}
.progress {
height: rem-calc(48);
@media (min-width: $small-breakpoint) {
height: rem-calc(24);
}
.meter {
background: #63D1C4;
}
}
.verification-step {
font-size: rem-calc(11);
padding-top: rem-calc(10);
@media (min-width: $small-breakpoint) {
line-height: $line-height;
padding-top: 0;
}
&.active {
color: white;
}
&.completed {
color: rgba(255,255,255,.5);
}
}
.send-letter {
background: none;
color: $link;
&:hover {
color: $link-hover;
}
}
.button + form {
display: inline-block;
margin-left: rem-calc(12);
}
.verification-list {
font-size: rem-calc(13);
list-style-type: none;
margin-left: 0;
span {
display: inline-block;
}
}
}

View File

@@ -1,5 +1,4 @@
class AccountController < ApplicationController
before_action :authenticate_user!
before_action :set_account
load_and_authorize_resource class: "User"

View File

@@ -1,11 +1,10 @@
class Admin::CommentsController < Admin::BaseController
before_filter :set_valid_filters, only: :index
before_filter :parse_filter, only: :index
has_filters %w{all with_confirmed_hide}
before_filter :load_comment, only: [:confirm_hide, :restore]
before_action :load_comment, only: [:confirm_hide, :restore]
def index
@comments = Comment.only_hidden.send(@filter).page(params[:page])
@comments = Comment.only_hidden.send(@current_filter).page(params[:page])
end
def confirm_hide
@@ -23,13 +22,4 @@ class Admin::CommentsController < Admin::BaseController
@comment = Comment.with_hidden.find(params[:id])
end
def set_valid_filters
@valid_filters = %w{all with_confirmed_hide}
end
def parse_filter
@filter = params[:filter]
@filter = 'all' unless @valid_filters.include?(@filter)
end
end

View File

@@ -1,11 +1,10 @@
class Admin::DebatesController < Admin::BaseController
before_filter :set_valid_filters, only: :index
before_filter :parse_filter, only: :index
has_filters %w{all with_confirmed_hide}, only: :index
before_filter :load_debate, only: [:confirm_hide, :restore]
before_action :load_debate, only: [:confirm_hide, :restore]
def index
@debates = Debate.only_hidden.send(@filter).page(params[:page])
@debates = Debate.only_hidden.send(@current_filter).page(params[:page])
end
def confirm_hide
@@ -24,13 +23,4 @@ class Admin::DebatesController < Admin::BaseController
@debate = Debate.with_hidden.find(params[:id])
end
def set_valid_filters
@valid_filters = %w{all with_confirmed_hide}
end
def parse_filter
@filter = params[:filter]
@filter = 'all' unless @valid_filters.include?(@filter)
end
end

View File

@@ -1,5 +1,4 @@
class Admin::ModeratorsController < Admin::BaseController
load_and_authorize_resource
def index

View File

@@ -1,11 +1,10 @@
class Admin::OrganizationsController < Admin::BaseController
before_filter :set_valid_filters, only: :index
before_filter :parse_filter, only: :index
has_filters %w{all pending verified rejected}, only: :index
load_and_authorize_resource except: :search
def index
@organizations = @organizations.send(@filter)
@organizations = @organizations.send(@current_filter)
@organizations = @organizations.includes(:user).order(:name, 'users.email').page(params[:page])
end
@@ -23,14 +22,4 @@ class Admin::OrganizationsController < Admin::BaseController
redirect_to request.query_parameters.merge(action: :index)
end
private
def set_valid_filters
@valid_filters = %w{all pending verified rejected}
end
def parse_filter
@filter = params[:filter]
@filter = 'all' unless @valid_filters.include?(@filter)
end
end

View File

@@ -1,11 +1,10 @@
class Admin::UsersController < Admin::BaseController
before_filter :set_valid_filters, only: :index
before_filter :parse_filter, only: :index
has_filters %w{all with_confirmed_hide}, only: :index
before_filter :load_user, only: [:confirm_hide, :restore]
before_action :load_user, only: [:confirm_hide, :restore]
def index
@users = User.only_hidden.send(@filter).page(params[:page])
@users = User.only_hidden.send(@current_filter).page(params[:page])
end
def show
@@ -30,13 +29,4 @@ class Admin::UsersController < Admin::BaseController
@user = User.with_hidden.find(params[:id])
end
def set_valid_filters
@valid_filters = %w{all with_confirmed_hide}
end
def parse_filter
@filter = params[:filter]
@filter = 'all' unless @valid_filters.include?(@filter)
end
end

View File

@@ -1,4 +1,5 @@
class Api::StatsController < Api::ApiController
def show
unless params[:events].present? || params[:visits].present?
return render json: {}, status: :bad_request
@@ -19,4 +20,5 @@ class Api::StatsController < Api::ApiController
render json: ds.build
end
end

View File

@@ -1,29 +1,28 @@
require "application_responder"
class ApplicationController < ActionController::Base
before_filter :authenticate_http_basic
before_filter :authenticate_user!, unless: :devise_controller?, if: :beta_site?
before_filter :authenticate_beta_tester!, unless: :devise_controller?, if: :beta_site?
check_authorization unless: :devise_controller?
include SimpleCaptcha::ControllerHelpers
self.responder = ApplicationResponder
respond_to :html
include HasFilters
before_action :set_locale
layout :set_layout
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_action :authenticate_http_basic
before_action :authenticate_user!, unless: :devise_controller?, if: :beta_site?
before_action :authenticate_beta_tester!, unless: :devise_controller?, if: :beta_site?
before_action :ensure_signup_complete
before_action :set_locale
check_authorization unless: :devise_controller?
self.responder = ApplicationResponder
protect_from_forgery with: :exception
rescue_from CanCan::AccessDenied do |exception|
redirect_to main_app.root_url, alert: exception.message
end
layout :set_layout
respond_to :html
private
def authenticate_http_basic

View File

@@ -0,0 +1,13 @@
module HasFilters
extend ActiveSupport::Concern
class_methods do
def has_filters(valid_filters, *args)
before_action(*args) do
@valid_filters = valid_filters
@current_filter = params[:filter]
@current_filter = @valid_filters.first unless @valid_filters.include?(@current_filter)
end
end
end
end

View File

@@ -1,14 +1,16 @@
class DebatesController < ApplicationController
before_action :parse_order, :parse_tag_filter, only: :index
before_action :parse_order, only: :index
before_action :parse_tag_filter, only: :index
before_action :authenticate_user!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :js
def index
@debates = Debate.search(params).page(params[:page]).for_render.send("sort_by_#{@order}")
@tags = ActsAsTaggableOn::Tag.all
@tag_cloud = Debate.tag_counts.order('count desc, name asc')
@debates = Debate.all
@debates = @debates.tagged_with(@tag_filter) if @tag_filter
@debates = @debates.page(params[:page]).for_render.send("sort_by_#{@order}")
@tag_cloud = Debate.tag_counts.order(taggings_count: :desc, name: :asc).limit(20)
set_debate_votes(@debates)
end
@@ -85,8 +87,9 @@ class DebatesController < ApplicationController
end
def parse_tag_filter
valid_tags = ActsAsTaggableOn::Tag.all.map(&:name)
@tag_filter = params[:tag] if valid_tags.include?(params[:tag])
if params[:tag].present?
@tag_filter = params[:tag] if ActsAsTaggableOn::Tag.where(name: params[:tag]).exists?
end
end
end

View File

@@ -2,9 +2,9 @@ class Moderation::BaseController < ApplicationController
layout 'admin'
before_action :authenticate_user!
before_action :verify_moderator
skip_authorization_check
before_action :verify_moderator
private

View File

@@ -1,12 +1,12 @@
class Moderation::CommentsController < Moderation::BaseController
before_filter :set_valid_filters, only: :index
before_filter :parse_filter, only: :index
before_filter :load_comments, only: :index
has_filters %w{all pending_flag_review with_ignored_flag}, only: :index
before_action :load_comments, only: :index
load_and_authorize_resource
def index
@comments = @comments.send(@filter)
@comments = @comments.send(@current_filter)
@comments = @comments.page(params[:page])
end
@@ -30,13 +30,4 @@ class Moderation::CommentsController < Moderation::BaseController
@comments = Comment.accessible_by(current_ability, :hide).flagged.sorted_for_moderation.includes(:commentable)
end
def set_valid_filters
@valid_filters = %w{all pending_flag_review with_ignored_flag}
end
def parse_filter
@filter = params[:filter]
@filter = 'all' unless @valid_filters.include?(@filter)
end
end

View File

@@ -1,13 +1,12 @@
class Moderation::DebatesController < Moderation::BaseController
before_filter :set_valid_filters, only: :index
before_filter :parse_filter, only: :index
before_filter :load_debates, only: :index
has_filters %w{all pending_flag_review with_ignored_flag}, only: :index
before_action :load_debates, only: :index
load_and_authorize_resource
def index
@debates = @debates.send(@filter)
@debates = @debates.page(params[:page])
@debates = @debates.send(@current_filter).page(params[:page])
end
def hide
@@ -30,13 +29,4 @@ class Moderation::DebatesController < Moderation::BaseController
@debates = Debate.accessible_by(current_ability, :hide).flagged.sorted_for_moderation
end
def set_valid_filters
@valid_filters = %w{all pending_flag_review with_ignored_flag}
end
def parse_filter
@filter = params[:filter]
@filter = 'all' unless @valid_filters.include?(@filter)
end
end

View File

@@ -1,4 +1,5 @@
class Organizations::RegistrationsController < Devise::RegistrationsController
def new
super do |user|
user.build_organization

View File

@@ -1,25 +1,36 @@
class PagesController < ApplicationController
skip_authorization_check
def help
def census_terms
end
def privacy
def conditions
end
def legal
def cooming_soon
end
def general_terms
end
def census_terms
def how_it_works
end
def transparency
def how_to_use
end
def more_information
end
def opendata
end
def participation
end
def privacy
end
def transparency
end
end

View File

@@ -1,6 +1,6 @@
class StatsController < ApplicationController
skip_authorization_check
before_action :verify_administrator
skip_authorization_check
def show
@event_types = Ahoy::Event.select(:name).uniq.pluck(:name)

View File

@@ -1,4 +1,5 @@
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def self.provides_callback_for(provider)
class_eval %Q{
def #{provider}
@@ -26,4 +27,5 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
finish_signup_path
end
end
end

View File

@@ -1,5 +1,5 @@
class Users::RegistrationsController < Devise::RegistrationsController
prepend_before_filter :authenticate_scope!, only: [:edit, :update, :destroy, :finish_signup, :do_finish_signup]
prepend_before_action :authenticate_scope!, only: [:edit, :update, :destroy, :finish_signup, :do_finish_signup]
def create
build_resource(sign_up_params)

View File

@@ -1,7 +1,7 @@
class Verification::LetterController < ApplicationController
before_action :authenticate_user!
before_action :verify_resident!
before_action :verify_phone_or_email!
before_action :verify_phone!
skip_authorization_check
def new
@@ -11,22 +11,37 @@ class Verification::LetterController < ApplicationController
def create
@letter = Verification::Letter.new(user: current_user)
if @letter.save
redirect_to account_path, notice: t('verification.letter.create.flash.success')
redirect_to edit_letter_path, notice: t('verification.letter.create.flash.success')
else
flash.now.alert = t('verification.letter.create.alert.failure')
render :new
end
end
def edit
@letter = Verification::Letter.new(user: current_user)
end
def update
@letter = Verification::Letter.new(letter_params.merge(user: current_user))
if @letter.verify?
current_user.update(verified_at: Time.now)
redirect_to account_path, notice: t('verification.letter.update.flash.success')
else
@error = t('verification.letter.update.error')
render :edit
end
end
private
def letter_params
params.require(:letter).permit()
params.require(:letter).permit(:verification_code)
end
def verify_phone_or_email!
def verify_phone!
unless current_user.confirmed_phone?
redirect_to verified_user_path, alert: t('verification.letter.alert.unconfirmed_personal_data')
redirect_to verified_user_path, alert: t('verification.letter.alert.unconfirmed_code')
end
end
end

View File

@@ -1,4 +1,5 @@
module ApplicationHelper
def percentage(vote, debate)
return "0%" if debate.total_votes == 0
debate.send(vote).percent_of(debate.total_votes).to_s + "%"

View File

@@ -1,4 +1,5 @@
module CacheKeysHelper
def locale_and_user_status
@cache_key_user ||= calculate_user_status
"#{I18n.locale}/#{@cache_key_user}"
@@ -17,4 +18,5 @@ module CacheKeysHelper
user_status
end
end

View File

@@ -1,4 +1,5 @@
module FlagsHelper
def show_flag_action?(flaggable)
current_user && !own_flaggable?(flaggable) && !flagged?(flaggable)
end
@@ -24,4 +25,5 @@ module FlagsHelper
flaggable.author_id == current_user.id
end
end
end

View File

@@ -1,4 +1,5 @@
module StatsHelper
def events_chart_tag(events, opt={})
events = events.join(',') if events.is_a? Array
opt[:data] ||= {}

View File

@@ -35,14 +35,6 @@ class Debate < ActiveRecord::Base
# Ahoy setup
visitable # Ahoy will automatically assign visit_id on create
def self.search(params)
if params[:tag]
tagged_with(params[:tag])
else
all
end
end
def likes
cached_votes_up
end

View File

@@ -1,5 +1,4 @@
class Flag < ActiveRecord::Base
belongs_to :user
belongs_to :flaggable, polymorphic: true, counter_cache: true

View File

@@ -1,5 +1,4 @@
class Organization < ActiveRecord::Base
belongs_to :user
validates :name, presence: true

View File

@@ -1,5 +1,4 @@
class Setting < ActiveRecord::Base
validates :key, presence: true, uniqueness: true
default_scope { order(key: :desc) }

View File

@@ -1,16 +1,12 @@
class Verification::Letter
include ActiveModel::Model
attr_accessor :user, :address
attr_accessor :user, :address, :verification_code
validates :user, presence: true
validates :address, presence: true
validate :correct_address
def initialize(attrs={})
@user = attrs[:user]
end
def save
valid? &&
letter_requested! &&
@@ -22,7 +18,11 @@ class Verification::Letter
end
def letter_requested!
user.update(letter_requested_at: Time.now)
user.update(letter_requested_at: Time.now, letter_verification_code: four_digit_code)
end
def verify?
user.letter_verification_code == verification_code
end
def update_user_address
@@ -50,4 +50,8 @@ class Verification::Letter
district: address[:nombre_distrito] }
end
def four_digit_code
rand.to_s[2..5]
end
end

View File

@@ -1,4 +1,3 @@
# make sure document_type is being stored and queried in the correct format (Is it DNI? a number, a string?)
class VerifiedUser < ActiveRecord::Base
scope :by_user, -> (user) { where(document_number: user.document_number,
document_type: user.document_type) }

View File

@@ -1,21 +1,26 @@
<div class="row account">
<div class="small-12 column">
<%= link_to t("account.show.change_credentials_link"), edit_user_registration_path, class: 'button radius small secondary right' %>
<%= link_to t("account.show.change_credentials_link"), edit_user_registration_path, class: "button radius small secondary right" %>
<span class="right verify-account">
<% if current_user.level_three_verified? %>
<p class="verified"><%= t("account.show.level_three_user") %></p>
<% elsif current_user.level_two_verified? %>
<p class="verified"><%= t("account.show.level_two_user") %></p>
<% else %>
<%= link_to t("account.show.verify_my_account"), new_residence_path, class: 'button radius small success right' %>
<% end %>
</span>
<div class="verification">
<span class="right verify-account">
<% if current_user.level_three_verified? %>
<p class="verified">
<i class="icon-check"></i>
<%= t("account.show.verified_account") %>
</p>
<% elsif current_user.level_two_verified? %>
<%= link_to t("account.show.finish_verification"), new_letter_path, class: "button radius small success right" %>
<% else %>
<%= link_to t("account.show.verify_my_account"), new_residence_path, class: "button radius small success right" %>
<% end %>
</span>
</div>
<h1 class="inline-block"><%= t("account.show.title") %></h1>
<%= form_for @account, as: :account, url: account_path do |f| %>
<%= render 'shared/errors', resource: @account %>
<%= render "shared/errors", resource: @account %>
<div class="row">
<div class="small-12 column">

View File

@@ -1,17 +1,6 @@
<h2><%= t("admin.comments.index.title") %></h2>
<dl class="sub-nav">
<dt><%= t("admin.comments.index.filter") %>:</dt>
<% @valid_filters.each do |filter| %>
<% if @filter == filter %>
<dd class="active"><%= t("admin.comments.index.filters.#{filter}") %></dd>
<% else %>
<dd><%= link_to t("admin.comments.index.filters.#{filter}"),
current_path_with_query_params(filter: filter) %></dd>
<% end %>
<% end %>
</dl>
<%= render 'shared/filter_subnav', i18n_namespace: "admin.comments.index" %>
<h3><%= page_entries_info @comments %></h3>

View File

@@ -1,17 +1,6 @@
<h2><%= t("admin.debates.index.title") %></h2>
<dl class="sub-nav">
<dt><%= t("admin.debates.index.filter") %>:</dt>
<% @valid_filters.each do |filter| %>
<% if @filter == filter %>
<dd class="active"><%= t("admin.debates.index.filters.#{filter}") %></dd>
<% else %>
<dd><%= link_to t("admin.debates.index.filters.#{filter}"),
current_path_with_query_params(filter: filter) %></dd>
<% end %>
<% end %>
</dl>
<%= render 'shared/filter_subnav', i18n_namespace: "admin.debates.index" %>
<h3><%= page_entries_info @debates %></h3>

View File

@@ -13,18 +13,7 @@
<% end %>
<!-- /. Search organizations -->
<dl class="sub-nav">
<dt><%= t("admin.organizations.index.filter") %>:</dt>
<% @valid_filters.each do |filter| %>
<% if @filter == filter %>
<dd class="active"><%= t("admin.organizations.index.filters.#{filter}") %></dd>
<% else %>
<dd><%= link_to t("admin.organizations.index.filters.#{filter}"),
current_path_with_query_params(filter: filter) %></dd>
<% end %>
<% end %>
</dl>
<%= render 'shared/filter_subnav', i18n_namespace: "admin.organizations.index" %>
<h3><%= page_entries_info @organizations %></h3>

View File

@@ -1,17 +1,6 @@
<h2><%= t("admin.users.index.title") %></h2>
<dl class="sub-nav">
<dt><%= t("admin.users.index.filter") %>:</dt>
<% @valid_filters.each do |filter| %>
<% if @filter == filter %>
<dd class="active"><%= t("admin.users.index.filters.#{filter}") %></dd>
<% else %>
<dd><%= link_to t("admin.users.index.filters.#{filter}"),
current_path_with_query_params(filter: filter) %></dd>
<% end %>
<% end %>
</dl>
<%= render 'shared/filter_subnav', i18n_namespace: "admin.users.index" %>
<h3><%= page_entries_info @users %></h3>

View File

@@ -4,14 +4,12 @@
<div class="row">
<div class="small-12 column">
<%= f.label :title, t("debates.form.debate_title") %>
<span class="note"><%= t("debates.form.title_instructions") %></span>
<%= f.text_field :title, maxlength: Debate::TITLE_LENGTH, placeholder: t("debates.form.debate_title") %>
<%= f.text_field :title, maxlength: Debate::TITLE_LENGTH, placeholder: t("debates.form.debate_title"), label: false %>
</div>
<div class="ckeditor small-12 column">
<%= f.label :description, t("debates.form.debate_text") %>
<span class="note"><%= t("debates.form.text_instructions") %></span>
<%= f.cktext_area :description, ckeditor: { language: I18n.locale } %>
<%= f.cktext_area :description, ckeditor: { language: I18n.locale }, label: false %>
</div>
<div class="small-12 column">
@@ -22,7 +20,7 @@
<a class="js-add-tag-link"><%= tag.name %></a>
<% end %>
</span>
<%= f.text_field :tag_list, value: @debate.tag_list.to_s %>
<%= f.text_field :tag_list, value: @debate.tag_list.to_s, label: false %>
</div>
<div class="small-12 column">
@@ -36,7 +34,7 @@
</div>
<div class="actions small-12 column">
<%= f.submit(class: "button radius") %>
<%= f.submit(class: "button radius", value: t("debates.form.start_debate")) %>
</div>
</div>
<% end %>

View File

@@ -3,30 +3,24 @@
<div class="filters row">
<div class="small-9 column">
<div class="inline-block" >
<% if @tag_filter %>
<h2>
<%= t("debates.index.filter_topic",
number: @debates.size,
topic: @tag_filter) %>
</h2>
<% else %>
<h2><%= t("debates.index.select_topic") %></h2>
<form class="inline-block">
<select class="js-location-changer" name="tag-filter">
<option value="/" selected="selected"><%= t("debates.index.all") %></option>
<% @tags.each do |tag| %>
<option value='<%= current_path_with_query_params(tag: tag.name) %>'>
<%= tag.name %>
</option>
<% end %>
</select>
</form>
<% end %>
</div>
<% if @tag_filter %>
<div class="inline-block small-8" >
<h2>
<%= t("debates.index.filter_topic",
count: @debates.size,
topic: @tag_filter) %>
</h2>
</div>
<% end %>
<div class="inline-block right">
<h6 class="inline-block"><%= t("debates.index.select_order") %></h6>
<div class="inline-block <%= 'right' if @tag_filter %>">
<h6 class="inline-block">
<% if @tag_filter %>
<%= t("debates.index.select_order") %>
<% else %>
<%= t("debates.index.select_order_long") %>
<% end %>
</h6>
<form class="inline-block">
<select class="js-location-changer" name="order-selector">
<% @valid_orders.each do |order| %>
@@ -48,7 +42,7 @@
</div>
<div class="small-12 medium-3 column">
<aside class="sidebar" role="complementary">
<%= link_to t("debates.index.create_debate"), new_debate_path, class: 'button radius expand' %>
<%= link_to t("debates.index.start_debate"), new_debate_path, class: 'button radius expand' %>
<%= render "shared/tag_cloud" %>
</aside>
</div>

View File

@@ -5,7 +5,7 @@
<i class="icon-angle-left left"></i>
<%= t("debates.new.back_link") %>
<% end %>
<h1><%= t("debates.new.publish_new") %></h1>
<h1><%= t("debates.new.start_new") %></h1>
<%= render "form" %>
</div>

View File

@@ -9,9 +9,13 @@
<p class="footer-description">
<%= t("layouts.footer.description",
open_source: link_to(t('layouts.footer.open_source'), t('layouts.footer.open_source_url'), target: 'blank'),
github_url: link_to(t('layouts.footer.github_url'), t('layouts.footer.github_url'), target: 'blank')).html_safe
more_info: link_to(t("layouts.footer.more_info"), t("layouts.footer.more_info_url")),
open_source: link_to(t("layouts.footer.open_source"), t("layouts.footer.open_source_url"), target: "blank"),
github: link_to(t("layouts.footer.github"), t("layouts.footer.github_url"), target: "blank")).html_safe
%>
<br>
<%= t("layouts.footer.contact_us") %>
<%= mail_to "web.gobiernoabierto@madrid.es" %>
</p>
</div>
@@ -35,7 +39,9 @@
<div class="subfooter row">
<div class="small-12 column">
<%= t("layouts.footer.copyright", year: Time.now.year) %>
<%= t("layouts.footer.copyright", year: Time.now.year) %>&nbsp;|&nbsp;
<%= link_to t("layouts.footer.privacy"), "/privacy" %>&nbsp;|&nbsp;
<%= link_to t("layouts.footer.conditions"), "/conditions" %>
</div>
</div>
</div>

View File

@@ -3,9 +3,9 @@
<div class="row">
<%= render "shared/locale_switcher" %>
<div class="external-links">
<%= link_to t("layouts.header.participation"), root_path, class: "selected" %>&nbsp;|
<%= link_to t("layouts.header.external_link_transparency"), "/transparency" %>&nbsp;|
<%= link_to t("layouts.header.external_link_opendata"), "/opendata" %>
<%= link_to t("layouts.header.participation"), root_path, class: ("selected" unless current_page?("/transparency") || current_page?("/opendata")) %>&nbsp;|
<%= link_to t("layouts.header.external_link_transparency"), "/transparency", class: ("selected" if current_page?("/transparency")) %>&nbsp;|
<%= link_to t("layouts.header.external_link_opendata"), "/opendata", class: ("selected" if current_page?("/opendata")) %>
</div>
</div>
</section>
@@ -38,10 +38,7 @@
<%#= link_to t("layouts.header.initiatives"), "#" %>
</div> -->
<div class="small-12 medium-2 column end">
<%= link_to t("layouts.header.how_it_works"), "/how_it_works" %>
</div>
<div class="small-12 medium-2 column end">
<%= link_to t("layouts.header.help"), "/help" %>
<%= link_to t("layouts.header.more_information"), "/more_information" %>
</div>
<div class="small-12 medium-2 column end">
<%= link_to t("layouts.header.external_link_blog"), t("layouts.header.external_link_blog_url"), target: "_blank" %>

View File

@@ -10,6 +10,7 @@
<%= javascript_include_tag "vendor/modernizr" %>
<%= javascript_include_tag "application", 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
<%= favicon_link_tag "favicon.ico" %>
</head>
<body class="admin">

View File

@@ -9,6 +9,7 @@
<%= javascript_include_tag "vendor/modernizr" %>
<%= javascript_include_tag "application", 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
<%= favicon_link_tag "favicon.ico" %>
</head>
<body class="auth-page">

View File

@@ -1,17 +1,6 @@
<h2><%= t("moderation.comments.index.title") %></h2>
<dl class="sub-nav">
<dt><%= t("moderation.comments.index.filter") %>:</dt>
<% @valid_filters.each do |filter| %>
<% if @filter == filter %>
<dd class="active"><%= t("moderation.comments.index.filters.#{filter}") %></dd>
<% else %>
<dd><%= link_to t("moderation.comments.index.filters.#{filter}"),
current_path_with_query_params(filter: filter) %></dd>
<% end %>
<% end %>
</dl>
<%= render 'shared/filter_subnav', i18n_namespace: "moderation.comments.index" %>
<h3><%= page_entries_info @comments %></h3>

View File

@@ -1,17 +1,6 @@
<h2><%= t("moderation.debates.index.title") %></h2>
<dl class="sub-nav">
<dt><%= t("moderation.debates.index.filter") %>:</dt>
<% @valid_filters.each do |filter| %>
<% if @filter == filter %>
<dd class="active"><%= t("moderation.debates.index.filters.#{filter}") %></dd>
<% else %>
<dd><%= link_to t("moderation.debates.index.filters.#{filter}"),
current_path_with_query_params(filter: filter) %></dd>
<% end %>
<% end %>
</dl>
<%= render 'shared/filter_subnav', i18n_namespace: "moderation.debates.index" %>
<h3><%= page_entries_info @debates %></h3>

View File

@@ -0,0 +1,8 @@
<div class="page row-full">
<div class="row">
<div class="text small-12 column">
<h1>Próximas novedades</h1>
<p>En breve inauguraremos la sección de propuestas ciudadanas. Una sección que permitirá que entre todos decidamos qué debe ser Madrid. Cualquiera podrá presentar propuestas, que en caso de que sean aceptadas mayoritariamente se llevarán a cabo por parte del Ayuntamiento. Debate, propón, decide.</p>
</div>
</div>
</div>

View File

@@ -0,0 +1,96 @@
<div class="page row-full">
<div class="row">
<div class="text small-12 column">
<h1><%= t("pages.conditions") %></h1>
<h2>AVISO LEGAL SOBRE LAS CONDICIONES DE USO, PRIVACIDAD Y PROTECCIÓN DE DATOS PERSONALES DEL PORTAL DE GOBIERNO ABIERTO DEL AYUNTAMIENTO DE MADRID</h2>
<h3>1. Ámbito de aplicación de las condiciones de uso</h3>
<p>La participación (entendiéndola como participación activa más allá de la lectura del contenido presente) en el Portal de Gobierno Abierto del Ayuntamiento de Madrid se regula por las presentes condiciones de uso que vinculan a todas las personas que participen en este sitio web. Por ello, cualquier persona que desee participar deberá registrarse, a cuyo fin se solicitará la aceptación de estas condiciones de uso.</p>
<p>El Ayuntamiento de Madrid se reserva la facultad de modificar las presentes condiciones de uso para la participación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid, cuya última versión se publicará en este sitio web.</p>
<p>La participación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid se regula por las presentes condiciones de uso que vinculan a todas las personas que participen en este sitio web. Cualquier persona que desee participar deberá registrarse, a cuyo fin se solicitará la aceptación de estas condiciones de uso.</p>
<p>El Ayuntamiento de Madrid se reserva la facultad de modificar las presentes condiciones de uso del Portal de Gobierno Abierto del Ayuntamiento de Madrid cuya última versión se publicará en este sitio web.</p>
<h3>2. Objetivo de la iniciativa</h3>
<p>A través del Portal de Gobierno Abierto, el Ayuntamiento de Madrid quiere fomentar la participación de los ciudadanos en la gestión de la ciudad, implicándoles en la generación de ideas y propuestas novedosas y viables, con el objeto de mejorar su calidad de vida. Es una apuesta decidida por una gestión más cercana a los ciudadanos que permitirá recibir sus propuestas y además, crear canales directos de comunicación con el gobierno municipal, contribuyendo a tomar las decisiones más acertadas para el interés general.</p>
<h3>3. Cuestiones generales sobre la participación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid</h3>
<p>Podrá participar cualquier persona física a partir de los 16 años que se haya registrado previamente en el Portal de Gobierno Abierto. Mediante la aceptación de estas condiciones de uso se declara tener 16 años o más. Los mayores de edad a cuyo cargo se encuentran los menores, son los plenos responsables de la actuación que tengan éstos en el Portal de Gobierno Abierto. No existe limitación en cuanto al número de debates, comentarios o propuestas a presentar por los participantes.</p>
<p>Al introducir el título de las propuestas, se recomienda escribir una descripción breve y precisa con un máximo de 2000 caracteres. Para completar la argumentación se podrán asociar documentos adjuntos o de las Redes Sociales Vimeo, Youtube, Slideshare, Flickr o SoundCloud.</p>
<h3>4. Obligaciones de los usuarios del Portal de Gobierno Abierto</h3>
<p>Al ser el Ayuntamiento de Madrid un punto de encuentro cuyo objetivo es debatir, y compartir y valorar propuestas relacionadas con la mejora de la ciudad, los usuarios están obligados a hacer un uso diligente y acorde a dicho objetivo.</p>
<p>El Ayuntamiento de Madrid no es responsable del uso incorrecto del Portal de Gobierno Abierto por los usuarios o de los contenidos localizados en el mismo, siendo cada usuario responsable de su uso correcto y de la legalidad de los contenidos y opiniones que haya compartido.</p>
<p>El Ayuntamiento de Madrid se reserva, por lo tanto, el derecho a limitar el acceso al Portal de Gobierno Abierto del Ayuntamiento de Madrid de opiniones, informaciones, comentarios o documentos que los usuarios quieran incorporar, pudiendo instalar filtros a tal efecto. Todo ello se realizará únicamente mientras tenga el fin de preservar el objetivo fundamental del Portal de Gobierno Abierto.</p>
<p>De acuerdo a la normativa legal vigente queda prohibida la utilización del Portal de Gobierno Abierto del Ayuntamiento de Madrid con fines distintos a los de debatir, compartir y valorar propuestas, y específicamente:</p>
<p>Compartir cualquier contenido que pueda ser considerado como una vulneración en cualquier forma de los derechos fundamentales al honor, imagen e intimidad personal y familiar de terceros o contra la dignidad de las personas.</p>
<p>Compartir imágenes o fotografías que recojan imágenes o datos personales de terceros sin haber obtenido el oportuno consentimiento de sus titulares.</p>
<p>Compartir cualquier contenido que vulnere el secreto en las comunicaciones, la infracción de derechos de propiedad industrial e intelectual o de las normas reguladoras de la protección de datos de carácter personal.</p>
<p>Reproducir, distribuir, compartir contenidos, informaciones o imágenes que hayan sido puestas a disposición por otros usuarios sin la autorización expresa de estos.</p>
<p>Su utilización con fines de publicidad.</p>
<p>La realización de cualquiera de los anteriores comportamientos permitirá al Ayuntamiento de Madrid suspender temporalmente la actividad de un participante, inhabilitar su cuenta o borrar su contenido, sin perjuicio de otras responsabilidades que puedan ser reclamadas.</p>
<p>En caso de que el contenido introducido por los usuarios incorpore un enlace a otro sitio web, el Ayuntamiento de Madrid no será responsable por los daños o perjuicios derivados del acceso al enlace o a sus contenidos.</p>
<p>En caso de litigio de cualquier clase o por cualquier motivo entre los participantes en el sitio web y/o un tercero, el Ayuntamiento de Madrid quedará exento de cualquier responsabilidad por reclamaciones, demandas o daños de cualquier naturaleza relacionados o derivados del litigio.</p>
<h3>5. Uso del Portal de Gobierno Abierto</h3>
<p>Los participantes podrán acceder y navegar por el Portal de Gobierno Abierto libremente y de forma anónima. Sólo cuando quieran realizar alguna acción que implique la creación, apoyo o comentario de una propuesta, o a la participación en un debate, se le solicitará que introduzca sus credenciales, para cuya obtención será necesario registrarse previamente. El registro que permitirá participar comentando en cualquiera de las secciones, creando debates o propuestas, se realizará introduciendo los siguientes datos:</p>
<ul>
<li>Nombre de usuario</li>
<li>Correo electrónico</li>
<li>Aceptación de las condiciones de uso de el Portal de Gobierno Abierto</li>
</ul>
<p>El Portal de Gobierno Abierto también permite la identificación mediante el usuario de Facebook, Twitter y Google+.</p>
<p>Para participar apoyando propuestas, al usuario se le requerirá que verifique su cuenta cumpliendo que tiene 16 años o más y está empadronado en Madrid, para lo cual se le guiará a través de una serie de pasos donde se le solicitarán datos relativos al padrón y un medio de comunicación a través del cual facilitarle uno o dos códigos seguros para completar la verificación de su cuenta (dependiendo del medio de comunicación elegido por el usuario).</p>
<p>El usuario podrá interactuar con la herramienta interviniendo, al menos, de las siguientes formas:</p>
<h4>1. DEBATES</h4>
<p>En el apartado de debates el usuario podrá participar:</p>
<ul>
<li>Creando un debate. Cada usuario podrá abrir uno o más debates. Los debates serán publicados automáticamente.</li>
<li>Votando de manera positiva o negativa a los debates creadas por los usuarios. Los debates aparecerán con los votos positivos y negativos recibidos. Cada usuario podrá exclusivamente votar o bien positivo o bien negativo, y una vez a un mismo debate.</li>
<li> Comentando los debates del resto de usuarios. Cada debate podrá ser comentado por el resto de usuarios.</li>
</ul>
<h4>2. PROPUESTAS</h4>
<p>En el apartado de propuestas ciudadanas el usuario podrá participar:</p>
<ul>
<li>Creando una propuesta. Cada usuario podrá dar de alta una o más propuestas. Las propuestas serán publicadas automáticamente.</li>
<li>Apoyando las propuestas creadas por los usuarios. Las propuestas aparecerán con el número de apoyos recibidos. Cada usuario podrá exclusivamente apoyar una vez a una misma propuesta. Cuando una propuesta reciba apoyos equivalente al 2% del padrón de personas con 16 años o más, la propuesta pasará a una fase posterior donde durante una semana se invitará a la ciudadanía a aceptarla o rechazarla como propuesta colectiva.</li>
<li>Comentando las propuestas del resto de usuarios. Cada propuesta podrá ser comentada por el resto de usuarios, pudiendo argumentar las razones del apoyo o introducir mejoras a la misma.</li>
</ul>
<h3>6. Condiciones para el tratamiento de los contenidos proporcionados por los usuarios</h3>
<p>Las presentes condiciones regulan los términos aplicables al contenido remitido por los usuarios de esta plataforma a través del formulario correspondiente (en adelante, el contenido). Estas condiciones se aplican tanto al contenido inicialmente remitido al Portal de Gobierno Abierto como a cualquier contenido que se envíe con posterioridad o se manifieste al Ayuntamiento de Madrid, debiendo significarse lo siguiente:</p>
<ul>
<li>A. No Confidencialidad: Todo el contenido remitido por el usuario al Ayuntamiento de Madrid deberá ser susceptible de ser conocido por el público en general. Por lo tanto, el Ayuntamiento de Madrid tratará el citado contenido como información no confidencial.</li>
<li>B. Procedimiento: En el caso de que el Ayuntamiento de Madrid esté interesado en el contenido remitido por el usuario, se pondrá en contacto con él para solicitarle información adicional. Dicha información tendrá asimismo carácter de no confidencial, sin perjuicio de que en el caso de que las partes consideren la necesidad de intercambiarse información de carácter confidencial se firme el correspondiente Acuerdo de Confidencialidad.<br><br>
El Ayuntamiento de Madrid se reserva el derecho de no contactar con los usuarios que le hubieran remitido el contenido. Todo ello sin perjuicio de lo establecido en el apartado relativo a "Derechos de Propiedad Intelectual e industrial".<br><br>
En el supuesto que el Ayuntamiento de Madrid, a su entera discreción, decidiera contactar con determinados usuarios, éstos conocen y aceptan que por ello el Ayuntamiento de Madrid no adquiere compromiso alguno.</li>
<li>C. Publicidad o difusión de los contenidos presentados: Los participantes en el Portal de Gobierno Abierto del Ayuntamiento de Madrid declaran conocer y aceptar el hecho de que la información aportada podrá ser publicada en la web <a href="http://www.madrid.es" target="_blank">www.madrid.es</a>, así como a través de otros medios que la organización considere oportunos para dar a conocer esta iniciativa.</li>
<li>D. No devolución material: El Ayuntamiento de Madrid carece de obligación alguna de devolver el Contenido remitido por los usuarios.</li>
<li>E. Procedimiento de aviso y retirada: El Ayuntamiento de Madrid procesará las peticiones de eliminación o retirada de contenidos que incumplan las condiciones de uso que hayan añadido los participantes. Asimismo, cualquier persona, con motivos razonados si existe incumplimiento de las presentes condiciones de uso, podrá solicitar la retirada de contenidos al Ayuntamiento de Madrid. El Ayuntamiento de Madrid se reserva el derecho de hacer las comprobaciones o verificaciones oportunas con carácter previo a la retirada de cualquier contenido.</li>
</ul>
<h3>7. Política de privacidad y protección de datos</h3>
<ul>
<li>A. Titularidad de los derechos de propiedad intelectual e industrial: El usuario que aporta el Contenido declara, con la aceptación de las presentes Condiciones, ser titular de los derechos de propiedad intelectual y/o industrial u ostentar derechos suficientes sobre dicho contenido y que además lo remite al Ayuntamiento de Madrid de forma voluntaria para su divulgación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid.<br><br>
La titularidad de todos y cada uno de los Contenidos presentados que se encuentren protegidos o sean susceptibles de encontrarse protegidos, por el Derecho de la Propiedad Industrial e Intelectual, corresponde a los autores y/o titulares de los mencionados Contenidos.<br><br>
El Ayuntamiento de Madrid no asume responsabilidad alguna, ya sea directa o indirecta, respecto de cualquier tipo de controversia, disputa y/o litigio que pudiera derivarse de la publicación, divulgación y/o difusión de los contenidos aportados sin el preceptivo consentimiento de sus legítimos titulares.<br><br>
El Ayuntamiento de Madrid respetará todos los Derechos de Propiedad Intelectual o Industrial sobre el contenido remitido por los usuarios. Cualquier vulneración de los Derechos de Propiedad Intelectual o Industrial será responsabilidad de la persona que aporte el contenido.<br><br>
El Ayuntamiento de Madrid, por la mera recepción del contenido, no recibe del usuario licencia alguna de propiedad intelectual o industrial, por lo que no hará uso del contenido salvo aceptación expresa de su titular.</li>
<li>B. Protección de datos: Los datos personales aportados por los usuarios que se registren en el Portal de Gobierno Abierto, serán incorporados y tratados en el fichero Gestión de Procesos Participativos, cuya finalidad es gestionar los procesos participativos para el control de la habilitación de las personas que participan en los mismos y recuento meramente numérico y estadístico de los resultados derivados de los procesos de participación ciudadana. Gestión de Agendas para convocatorias y envío de información solicitada. El órgano responsable del fichero es la Dirección General competente en materia de Participación Ciudadana, ante la que la persona interesada podrá ejercer los derechos de acceso, rectificación, cancelación y oposición, todo lo cual se informa en cumplimiento del artículo 5 de la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.</li>
</ul>
<p>Como principio general, los datos personales no serán comunicados a terceros, excepto cuando la comunicación haya sido autorizada por el usuario, o la información sea requerida por la autoridad judicial, ministerio fiscal o la policía judicial, o se de alguno de los supuestos regulados en el artículo 11 de la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.<p>
<ul>
<li>Los derechos de acceso, rectificación, cancelación y oposición, se podrán ejercitar dirigiendo una comunicación por escrito al Ayuntamiento de Madrid, Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto, Dirección General de Participación Ciudadana.</li>
</ul>
<h3>8. Normativa aplicable</h3>
<p>Las normas del ordenamiento jurídico español rigen de manera exclusiva estas condiciones de uso. Cualquier disputa, controversia o reclamación derivada de estas condiciones de uso, o el incumplimiento, rescisión o invalidación de estas, se resolverán exclusivamente ante los juzgados competentes.</p>
<h3>9. Revisión de las condiciones de uso</h3>
<p>El Ayuntamiento de Madrid se reserva el derecho de revisar las presentes condiciones de uso y la política de privacidad en cualquier momento y por cualquier razón. En dicho caso, los usuarios registrados serán avisados a través de este espacio en línea y, si continúan utilizando el Portal de Gobierno Abierto, se entenderán aceptadas las modificaciones introducidas.</p>
</div>
</div>
</div>

View File

@@ -1,54 +0,0 @@
<div class="row-full page">
<div class="row">
<div class="small-12 column">
<div class="small-12 medium-3 column menu">
<h1>Ayuda</h1>
<a href="#2">Utilízala en tu municipio libremente o ayúdanos a mejorarla, es software libre</a>
<a href="#3">Próximas novedades</a>
<a href="#4">El Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto</a>
</div>
<div class="small-12 medium-9 column text">
<h2 id="2">Utilízala en tu municipio libremente o ayúdanos a mejorarla, es software libre</h2>
<p>Este Portal de Gobierno Abierto es software libre, con licencia AGPLv3, esto significa en palabras sencillas, que cualquiera puede libremente usar el código, copiarlo, verlo en detalle, modificarlo, y redistribuirlo al mundo con las modificaciones que quiera (manteniendo el que otros puedan a su vez hacer lo mismo). Porque creemos que la cultura es mejor y más rica, cuando se libera.</p>
<p>No sólo puedes utilizar libremente este portal en tu municipio, sino que desde el Ayuntamiento de Madrid vamos a ayudarte todo lo posible a que lo hagas, así que si estás interesado, escríbenos a ag.gobiernoabierto@madrid.es [imagen o algo así del e-mail para que no nos troléen demasiado los spammers]</p>
<p>Si eres programador, puedes ver el código y ayudarnos a mejorarlo en https://github.com/ayuntamientomadrid</p>
<h2 id="3">Próximas novedades</h2>
<p>En breve inauguraremos la sección de propuestas ciudadanas. Una sección que permitirá que entre todos decidamos qué debe ser Madrid. Cualquiera podrá presentar propuestas, que en caso de que sean aceptadas mayoritariamente se llevarán a cabo por parte del Ayuntamiento. Debate, propón, decide.</p>
<h2 id="4">El Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto.</h2>
<p>El nuevo gobierno del Ayuntamiento de Madrid ha creado un nuevo área de gobierno: Participación Ciudadana, Transparencia y Gobierno Abierto. El objetivo de este área es claro: que los madrileños puedan decidir directamente la política de la ciudad, y que todo lo que ocurra en el Ayuntamiento, hasta el último rincón, esté a la vista de todos.</p>
<p>Iremos publicando nuestros avances, las novedades y cualquier otra cosa que queramos compartir con vosotros en nuestro blog: [URL todavía pendiente]</p>
<p>Y podéis escribirnos para cualquier cosa a: ag.gobiernoabierto@madrid.es [imagen o algo así del e-mail para que no nos troléen demasiado los spammers]</p>
<p>A continuación os presentamos algunas de los principales novedades que tenemos planeadas poner en marcha, aparte de las que vayamos diseñando o se nos vayan proponiendo durante la legislatura:</p>
<h3>Participación.</h3>
<ul>
<li>Presupuestos participativos. Parte del presupuesto de inversión del Ayuntamiento (el que no está comprometido ya con necesidades básicas como pueden ser los servicios sociales o las emergencias), será reservado para ser decidido su uso por la ciudadanía. La gente hará propuestas, se tasarán las más apoyadas, y luego los ciudadanos decidirán en cuáles de esos proyectos priorizar el presupuesto reservado.</li>
<li> Legislacion colaborativa. A través de diferentes fases de participación, la ciudadanía tendrá un papel fundamental colaborando directamente en la elaboración de las propuestas, reglamentos, decretos o cualquier otro tipo de trabajo político desarrollado por el gobierno municipal. Una participación real desde el principio al fin del proceso legislativo, desde decidir los expertos en la materia, hasta revisar el texto final.</li>
<li> Co-gobierno ciudadano. Mediante este sistema la ciudadanía podrá decidir las líneas prioritarias de actuación del Ayuntamiento a medio plazo.</li>
<li>Participación sectorial. La participación ciudadana se va a tratar de manera transversal en todas las áreas de gobierno del Ayuntamiento, afectando a todos los procesos que se lleven a cabo. Un ejemplo de esto es el proceso de auditoría ciudadana de la deuda, que llevaremos a cabo con el Área de Gobierno de Economía y Hacienda.</li>
<li>Inclusión, neutralidad y privacidad. Una de las misiones principales del área será velar por la inclusión de todo el mundo en los procesos participativos, para que todas las voces y voluntades formen parte de ellos y no se quede nadie fuera. Para ello, desarrollaremos una mesa de inclusión a la que invitaremos a todos los expertos, colectivos y asociaciones que trabajen con colectivos excluidos, para diseñar las maneras adecuadas de superar estas brechas. La protección de la participación se complementará con la protección de la neutralidad y privacidad en todos los procesos, para asegurar su legitimidad y confianza.</li>
<li>Innovación social. Pretendemos crear un entorno que movilice la inteligencia colectiva existente en favor de una ciudad más hospitalaria e inclusiva. Espacios donde la sociedad se hable y piense con la administración, con la convicción de que son los ciudadanos quienes mejor conocen sus problemas, y es en lo colectivo donde están los expertos que pueden hallar las soluciones.</li>
</ul>
</div>
</div>
</div>
</div>

View File

@@ -1,40 +1,43 @@
<div class="row-full page">
<div class="page row-full">
<div class="row">
<div class="small-12 column">
<div class="small-12 medium-3 column menu">
<h1>¿Cómo funciona esta página?</h1>
<a href="#1">¿Cómo funciona esta página?</a>
<div class="menu small-12 medium-3 column">
<p><strong>¿Cómo funciona este Portal de Gobierno Abierto?</strong></p>
<ul>
<li>
<a href="#">I. Participación</a>
<ul>
<li><a href="#">I.1. Espacio de debate</a></li>
</ul>
</li>
</ul>
</div>
<div class="text small-12 medium-9 column">
<div class="small-12 medium-9 column text">
<h2 id="1">¿Cómo funciona esta página?</h2>
<h1>¿Cómo funciona este Portal de Gobierno Abierto?</h1>
<p>El nuevo Portal de Gobierno Abierto está dividido en tres partes: Participación, Transparencia y Datos Abiertos (verás los enlaces en la parte superior derecha).</p>
<p>Participación: Donde poder decidir qué ciudad queremos tener (a través de propuestas ciudadanas, espacios de debate, presupuestos participativos, legislación colaborativa, y muchos otros procesos que iremos implementando)</p>
<blockquote>
<p><strong>I. Participación:</strong> Donde poder decidir qué ciudad queremos tener (a través de propuestas ciudadanas, espacios de debate, presupuestos participativos, legislación colaborativa, y muchos otros procesos que iremos implementando)</p>
<p>Transparencia: El espacio para ejercer nuestro derecho de acceso a la información. El derecho a que cualquier persona pueda preguntar cualquier tipo de información sobre el Ayuntamiento, y se le deba responder, y de manera clara y satisfaciendo la pregunta.</p>
<p><strong>II. Transparencia:</strong> El espacio para ejercer nuestro derecho de acceso a la información. El derecho a que cualquier persona pueda preguntar cualquier tipo de información sobre el Ayuntamiento, y se le deba responder de manera clara y satisfaciendo la pregunta.</p>
<p>Datos Abiertos: Aquí iremos colgando todas las bases de datos que tiene el Ayuntamiento, para que cualquiera pueda usar toda la información directamente, sin necesidad ni siquiera de preguntar.</p>
<p><strong>III. Datos Abiertos:</strong> Aquí iremos colgando todas las bases de datos que tiene el Ayuntamiento, para que cualquiera pueda usar toda la información directamente, sin necesidad ni siquiera de preguntar.</p>
</blockquote>
<p>Inauguramos el nuevo portal con la nueva sección de Participación, y en breve añadiremos las nuevas secciones de Transparencia y Datos Abiertos (así que mantenemos por el momento los enlaces a las páginas al respecto que ya existían).</p>
<h3>Participación</h3>
<h2>I. Participación</h2>
<p>El apartado de participación comprenderá diferentes mecanismos de participación: propuestas ciudadanas, espacios de debate, presupuestos participativos, legislación colaborativa, entre muchos otros. Por el momento presentamos el espacio de debate, y muy pronto las propuestas ciudadanas.</p>
<h4>Espacio de debate</h4>
<h3>I.I. Espacio de debate</h3>
<p>En éste espacio, cualquier persona puede abrir un hilo de discusión sobre cualquier tema, creando un espacio independiente donde la gente podrá debatir sobre el tema propuesto. De esta manera, en este espacio digital convivirán cada día cientos de espacios de debate distintos entre los que la ciudadanía podrá pasearse, sumándose a los que más les interese.</p>
<p>Tanto los hilos, como los comentarios podrán ser valorados por cualquiera, de tal manera que será la propia ciudadanía, y nadie en su nombre, la que decida cuáles son los temas más importantes en cada momento. Estos serán presentados en la portada del espacio, pudiendo por supuesto accederse a todos los demás temas en páginas posteriores, o usando otros criterios de ordenación (los temas con más comentarios, los más nuevos, los más controvertidos, etc.).</p>
<p>Cada uno de los trabajadores del Ayuntamiento tiene un usuario propio, que será resaltado como tal, permitiendo que participen en los debates al mismo nivel que todos los demás ciudadanos. Esto permitirá crear espacios de comunicación directos entre unos y otros, evitando los inconvenientes que implica la comunicación medidada, y respondiendo a un planteamiento claro por parte del nuevo gobierno de Madrid por el cual el Ayuntamiento trabaja para sus ciudadanos, y ante ellos debe responder.</p>
<p>[Puedes obtener información más detallada de cómo interactuar en el espacio de debate en este enlace] [no sé si es mejor el tutorial llevarlo a una página siguiente o que esté también aquí] [esto lo hacemos una vez esté lista la página]</p>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,14 @@
<div class="page row-full">
<div class="row">
<div class="text small-12 column">
<h1>Utilízalo en tu municipio</h1>
<p>Utilízalo en tu municipio libremente o ayúdanos a mejorarlo, es software libre.</p>
<p>Este Portal de Gobierno Abierto es software libre, con <a href="http://www.gnu.org/licenses/agpl-3.0.html" target="_blank">licencia AGPLv3</a>, esto significa en palabras sencillas, que cualquiera puede libremente usar el código, copiarlo, verlo en detalle, modificarlo, y redistribuirlo al mundo con las modificaciones que quiera (manteniendo el que otros puedan a su vez hacer lo mismo). Porque creemos que la cultura es mejor y más rica cuando se libera.</p>
<p>No sólo puedes utilizar libremente este portal en tu municipio, sino que desde el Ayuntamiento de Madrid vamos a ayudarte todo lo posible a que lo hagas, así que si estás interesado, escríbenos a <a href="mailto:ag.gobiernoabierto@madrid.es">ag.gobiernoabierto@madrid.es</a></p>
<p>Si eres programador, puedes ver el código y ayudarnos a mejorarlo en <a href="https://github.com/ayuntamientomadrid" target="_blank">github</a>.</p>
</div>
</div>
</div>

View File

@@ -1,7 +0,0 @@
<div class="row-full page">
<div class="row">
<div class="small-12 column">
<h1><%= t('pages.legal') %></h1>
</div>
</div>
</div>

View File

@@ -0,0 +1,13 @@
<div class="page row-full">
<div class="row">
<div class="text small-12 column">
<h1>Más información</h1>
<ul>
<li><a href="/how_it_works">¿Cómo funciona este Portal de Gobierno Abierto?</a></li>
<li><a href="/how_to_use">Utilízalo en tu municipio libremente o ayúdanos a mejorarlo, es software libre</a></li>
<li><a href="/coming_soon">Próximas novedades</a></li>
<li><a href="/participation">El Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto</a></li>
</ul>
</div>
</div>
</div>

View File

@@ -0,0 +1,47 @@
<div class="page row-full">
<div class="row">
<div class="menu small-12 medium-3 column">
<p><strong>El Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto</strong></p>
<ul>
<li>
<a href="#">I. Participación</a>
<ul>
<li><a href="#">I.1. Espacio de debate</a></li>
<li><a href="#">I.2. Presupuestos participativos</a></li>
<li><a href="#">I.3. Legislacion colaborativa</a></li>
<li><a href="#">I.4. Co-gobierno ciudadano</a></li>
<li><a href="#">I.5. Participación sectorial</a></li>
<li><a href="#">I.6. Inclusión, neutralidad y privacidad</a></li>
<li><a href="#">I.7. Innovación social</a></li>
</ul>
</li>
</ul>
</div>
<div class="text small-12 medium-9 column">
<h1>El Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto</h1>
<p>El nuevo gobierno del Ayuntamiento de Madrid ha creado un nuevo área de gobierno: Participación Ciudadana, Transparencia y Gobierno Abierto. El objetivo de este área es claro: que los madrileños puedan decidir directamente la política de la ciudad, y que todo lo que ocurra en el Ayuntamiento, hasta el último rincón, esté a la vista de todos.</p>
<p>Iremos publicando nuestros avances, las novedades y cualquier otra cosa que queramos compartir con vosotros en <a href="http://diario.madrid.es/participa/" target="_blank">nuestro blog</a>.</p>
<p>Y podéis escribirnos para cualquier cosa a la dirección <a href="mailto:ag.gobiernoabierto@madrid.es">ag.gobiernoabierto@madrid.es</a></p>
<p>A continuación os presentamos algunas de los principales novedades que tenemos planeadas poner en marcha, aparte de las que vayamos diseñando o se nos vayan proponiendo durante la legislatura:</p>
<h3>I. Participación.</h3>
<ul>
<li><strong>I.1. Presupuestos participativos.</strong> Parte del presupuesto de inversión del Ayuntamiento (el que no está comprometido ya con necesidades básicas como pueden ser los servicios sociales o las emergencias), será reservado para ser decidido su uso por la ciudadanía. La gente hará propuestas, se tasarán las más apoyadas, y luego los ciudadanos decidirán en cuáles de esos proyectos priorizar el presupuesto reservado.</li>
<li><strong>I.2. Legislacion colaborativa.</strong> A través de diferentes fases de participación, la ciudadanía tendrá un papel fundamental colaborando directamente en la elaboración de las propuestas, reglamentos, decretos o cualquier otro tipo de trabajo político desarrollado por el gobierno municipal. Una participación real desde el principio al fin del proceso legislativo, desde decidir los expertos en la materia hasta revisar el texto final.</li>
<li><strong>I.3. Co-gobierno ciudadano.</strong> Mediante este sistema la ciudadanía podrá decidir las líneas prioritarias de actuación del Ayuntamiento a medio plazo.</li>
<li><strong>I.4. Participación sectorial.</strong> La participación ciudadana se va a tratar de manera transversal en todas las áreas de gobierno del Ayuntamiento, afectando a todos los procesos que se lleven a cabo. Un ejemplo de esto es el proceso de auditoría ciudadana de la deuda, que llevaremos a cabo con el Área de Gobierno de Economía y Hacienda.</li>
<li><strong>I.5. Inclusión, neutralidad y privacidad.</strong> Una de las misiones principales del área será velar por la inclusión de todo el mundo en los procesos participativos, para que todas las voces y voluntades formen parte de ellos y no se quede nadie fuera. Para ello, desarrollaremos una mesa de inclusión a la que invitaremos a todos los expertos, colectivos y asociaciones que trabajen con colectivos excluidos, para diseñar las maneras adecuadas de superar estas brechas. La protección de la participación se complementará con la protección de la neutralidad y privacidad en todos los procesos, para asegurar su legitimidad y confianza.</li>
<li><strong>I.6. Innovación social.</strong> Pretendemos crear un entorno que movilice la inteligencia colectiva existente en favor de una ciudad más hospitalaria e inclusiva. Espacios donde la sociedad se hable y piense con la administración, con la convicción de que son los ciudadanos quienes mejor conocen sus problemas, y es en lo colectivo donde están los expertos que pueden hallar las soluciones.</li>
</ul>
</div>
</div>
</div>

View File

@@ -1,7 +1,22 @@
<div class="row-full page">
<div class="page row-full">
<div class="row">
<div class="small-12 column">
<h1><%= t('pages.privacy') %></h1>
<div class="text small-12 column">
<h1><%= t("pages.privacy") %></h1>
<h2>AVISO DE PROTECCIÓN DE DATOS</h2>
<ol> 
<li>La navegación por la informacion disponible en el Portal de Gobierno Abierto del Ayuntamiento de Madrid es anónima.</li>
<li>Para utilizar los servicios contenidos en el Portal de Gobierno Abierto del Ayuntamiento de Madrid el usuario deberá darse de alta yproporcionar previamente los datos de carácter personal segun la informacion especifica que consta en cada tipo de alta.</li>
<li>Los datos aportados serán incorporados y tratados por el Ayuntamiento de Madrid de acuerdo con la descripción del fichero siguiente:
<ul> 
<li><strong>Nombre del fichero/tratamiento:</strong> GESTIÓN DE PROCESOS PARTICIPATIVOS</li>
<li><strong>Finalidad del fichero/tratamiento:</strong> Gestionar los procesos participativos para el control de la habilitación de las personas que participan en los mismos y recuento meramente numérico y estadístico de los resultados derivados de los procesos de participación ciudadana</li>
<li><strong>Órgano responsable:</strong> DIRECCIÓN GENERAL DE PARTICIPACIÓN CIUDADANA (c/ Alcalá 45, 28014-Madrid)</li>
</ul>
</li>
<li>El interesado podrá ejercer los derechos de acceso, rectificación, cancelación y oposición, ante el órgano responsable indicado  todo lo cual se informa en el cumplimiento del artículo 5 de la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.</li>
<li>Como principio general, este sitio web no comparte ni revela información obtenida, excepto cuando haya sido autorizada por el usuario, o la informacion sea requerida por la autoridad judicial, ministerio fiscal o la policia judicial, o se de alguno de los supuestos regulados en el artículo 11 de la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.</li>
</ol>
</div>
</div>
</div>

View File

@@ -0,0 +1,17 @@
<% # Params:
#
# i18n_namespace: for example "moderation.debates.index"
%>
<dl class="sub-nav">
<dt><%= t("#{i18n_namespace}.filter") %>: </dt>
<% @valid_filters.each do |filter| %>
<% if @current_filter == filter %>
<dd class="active"><%= t("#{i18n_namespace}.filters.#{filter}") %></dd>
<% else %>
<dd><%= link_to t("#{i18n_namespace}.filters.#{filter}"),
current_path_with_query_params(filter: filter) %></dd>
<% end %>
<% end %>
</dl>

View File

@@ -13,7 +13,11 @@
<div class="row">
<div class="small-12 column">
<%= f.text_field :username, placeholder: t("devise_views.users.registrations.new.username_label") %>
<%= f.label t("devise_views.users.registrations.new.username_label") %>
<span class="note"><%= t("devise_views.users.registrations.new.username_note") %></span>
<%= f.text_field :username, placeholder: t("devise_views.users.registrations.new.username_label"), label: false %>
<%= f.email_field :email, placeholder: t("devise_views.users.registrations.new.email_label") %>
<%= f.password_field :password, autocomplete: "off",

View File

@@ -0,0 +1,37 @@
<div class="verification account row">
<div class="small-12 column">
<div class="text-center">
<div class="small-4 column verification-step completed">
<%= t("verification.step_1") %>
</div>
<div class="small-4 column verification-step completed">
<%= t("verification.step_2") %>
</div>
<div class="small-4 column verification-step active">
<%= t("verification.step_3") %>
</div>
<div class="progress small-12 success round">
<span class="meter" style="width: 100%"></span>
</div>
</div>
<div class="small-12 medium-12 column">
<h1 class="inline-block"><%= t("verification.letter.edit.title") %></h1>
<div class="small-12 medium-6">
<%= form_for @letter, as: "letter", url: letter_path, method: :put do |f| %>
<% if @error %>
<div class="alert-box alert radius"><%= @error %></div>
<% end %>
<%= f.text_field :verification_code, label: t("verification.letter.edit.confirmation_code") %>
<%= f.submit t("verification.letter.new.send_code"), class: "button radius success" %>
<% end %>
</div>
</div>
</div>
</div>

View File

@@ -1,15 +1,36 @@
<div class="row account">
<div class="verification account row">
<div class="small-12 column">
<h1 class="inline-block"><%= t('verification.letter.new.title') %></h1>
<div class="text-center">
<div class="small-4 column verification-step completed">
<%= t("verification.step_1") %>
</div>
<div class="small-4 column verification-step completed">
<%= t("verification.step_2") %>
</div>
<div class="small-4 column verification-step active">
<%= t("verification.step_3") %>
</div>
<div>
<%= t('verification.letter.new.explanation') %>
<div class="progress small-12 success round">
<span class="meter" style="width: 100%"></span>
</div>
</div>
<%= form_for @letter, as: "letter", url: letter_path do |f| %>
<%= render 'shared/errors', resource: @letter %>
<%= f.submit t('verification.letter.new.submit_button') %>
<% end %>
<div class="small-12 medium-12 column">
<h1 class="inline-block"><%= t("verification.letter.new.title") %></h1>
<%= t("verification.letter.new.explanation_html") %>
<%= link_to t("verification.letter.new.offices"), t("verification.letter.new.offices_url"),
target: "_blank", class: "button radius inline-block"
%>
<%= form_for @letter, as: "letter", url: letter_path do |f| %>
<%= f.submit t("verification.letter.new.send_letter"), class: "button radius secondary inline-block" %>
<% end %>
</div>
</div>
</div>
</div>

View File

@@ -1,12 +1,12 @@
<% if @residence.errors[:residence_in_madrid].present? %>
<div id="error_explanation" class="alert-box alert radius">
<%= t('verification.residence.new.error_verifying_census') %>
<%= mail_to "tec.gobiernoabierto@madrid.es" %>
<%= t("verification.residence.new.error_verifying_census") %>
<%= mail_to "web.gobiernoabierto@madrid.es" %>
</div>
<% else %>
<%= render 'shared/errors',
<%= render "shared/errors",
resource: @residence,
message: t('verification.residence.new.form_errors') %>
<% end %>
message: t("verification.residence.new.form_errors") %>
<% end %>

View File

@@ -1,38 +1,64 @@
<div class="row account">
<div class="verification account row">
<div class="small-12 column">
<h1 class="inline-block"><%= t('verification.residence.new.title') %></h1>
<div class="text-center">
<div class="small-4 column verification-step active">
<%= t("verification.step_1") %>
</div>
<div class="small-4 column verification-step">
<%= t("verification.step_2") %>
</div>
<div class="small-4 column verification-step">
<%= t("verification.step_3") %>
</div>
</div>
<div class="progress small-12 success round">
<span class="meter" style="width: 33%"></span>
</div>
<h1 class="inline-block"><%= t("verification.residence.new.title") %></h1>
<%= form_for @residence, as: "residence", url: residence_path do |f| %>
<%= render 'errors' %>
<%= render "errors" %>
<div class="small-12 medium-6">
<div class="small-6 medium-3">
<%= f.select :document_type, document_types, prompt: "" %>
<div class="small-12 medium-8">
<div class="small-12 medium-4 left">
<%= f.label t("verification.residence.new.document_type_label") %>
<%= f.select :document_type, document_types, prompt: "", label: false %>
</div>
<div class="small-6 medium-8">
<%= f.text_field :document_number %>
<div class="small-12 medium-5 left">
<%= f.label t("verification.residence.new.document_number") %>
<%= f.text_field :document_number, label: false %>
</div>
</div>
<div class="date small-12 medium-6">
<div class="date small-12 medium-6 clear">
<%= f.label t("verification.residence.new.date_of_birth") %>
<%= f.date_select :date_of_birth,
prompt: true,
start_year: 1900, end_year: 16.years.ago.year %>
start_year: 1900, end_year: 16.years.ago.year,
label: false %>
</div>
<div class="small-12 medium-4 clear">
<%= f.text_field :postal_code %>
<%= f.label t("verification.residence.new.postal_code") %>
<%= f.text_field :postal_code, label: false %>
</div>
<div class="small-12">
<%= f.check_box :terms_of_service, label: t("verification.residence.new.accept_terms_text") %>
<%= link_to t("verification.residence.new.accept_terms_link"), '/census_terms', target: "_blank" %>
<%= f.check_box :terms_of_service, label: false %>
<%= f.label :terms_of_service do %>
<%= t("verification.residence.new.accept_terms_text",
terms_url: link_to(t("verification.residence.new.terms"), "/census_terms",
target: "_blank")).html_safe
%>
<% end %>
</div>
<div class="small-12 clear">
<%= f.submit "Verify" %>
<%= f.submit t("verification.residence.new.verify_residence") %>
</div>
<% end %>
</div>
</div>
</div>

View File

@@ -1,16 +1,38 @@
<div class="row account">
<div class="verification account row">
<div class="small-12 column">
<div class="text-center">
<h1 class="inline-block"><%= t('verification.sms.edit.title') %></h1>
<div class="small-4 column verification-step completed">
<%= t("verification.step_1") %>
</div>
<div class="small-4 column verification-step active">
<%= t("verification.step_2") %>
</div>
<div class="small-4 column verification-step">
<%= t("verification.step_3") %>
</div>
</div>
<div class="progress small-12 success round">
<span class="meter" style="width: 66%"></span>
</div>
<h1 class="inline-block"><%= t("verification.sms.edit.title") %></h1>
<%= form_for @sms, as: "sms", url: sms_path, method: :put do |f| %>
<p><%= @error %></p>
<%= f.text_field :confirmation_code %>
<% if @error %>
<div class="alert-box alert radius"><%= @error %></div>
<% end %>
<%= f.submit t('verification.sms.edit.submit_button') %>
<div class="small-12 medium-6">
<%= f.label t("verification.sms.edit.confirmation_code") %>
<%= f.text_field :confirmation_code, label: false %>
</div>
<%= f.submit t("verification.sms.edit.submit_button") %>
<% end %>
<%= t('verification.sms.edit.resend_sms_text') %>
<%= link_to t('verification.sms.edit.resend_sms_link'), verified_user_path %>
<%= t("verification.sms.edit.resend_sms_text") %>
<%= link_to t("verification.sms.edit.resend_sms_link"), verified_user_path %>
</div>
</div>
</div>

View File

@@ -1,14 +1,33 @@
<div class="row account">
<div class="verification account row">
<div class="small-12 column">
<div class="text-center">
<h1 class="inline-block"><%= t('verification.sms.new.title') %></h1>
<div class="small-4 column verification-step completed">
<%= t("verification.step_1") %>
</div>
<div class="small-4 column verification-step active">
<%= t("verification.step_2") %>
</div>
<div class="small-4 column verification-step">
<%= t("verification.step_3") %>
</div>
</div>
<div class="progress small-12 success round">
<span class="meter" style="width: 66%"></span>
</div>
<h1 class="inline-block"><%= t("verification.sms.new.title") %></h1>
<%= form_for @sms, as: "sms", url: sms_path do |f| %>
<%= render 'shared/errors', resource: @sms %>
<%= render "shared/errors", resource: @sms %>
<%= f.text_field :phone %>
<div class="small-12 medium-6">
<%= f.label t("verification.sms.new.phone") %>
<%= f.text_field :phone, label: false %>
</div>
<%= f.submit t('verification.sms.new.submit_button') %>
<%= f.submit t("verification.sms.new.submit_button") %>
<% end %>
</div>
</div>
</div>

View File

@@ -1,4 +1,4 @@
<%= form_for verified_user, url: url, method: :post do |f| %>
<%= f.hidden_field :id %>
<%= f.submit t('verification.verified_user.form.submit_button') %>
<% end %>
<%= f.submit t("verification.verified_user.form.submit_button"), class: "button radius success tiny" %>
<% end %>

View File

@@ -1,49 +1,41 @@
<div class="row account">
<div class="verification account row">
<div class="small-12 column">
<h1 class="inline-block"><%= t('verification.verified_user.show.title') %></h1>
<h1 class="inline-block"><%= t("verification.verified_user.show.title") %></h1>
<p><%= t("verification.verified_user.show.explanation") %></p>
<% if @verified_users.map(&:email).any? %>
<div><strong><%= t('verification.verified_user.show.email_title') %></strong></div>
<ul>
<h2><%= t("verification.verified_user.show.email_title") %></h2>
<ul class="verification-list">
<% @verified_users.each do |verified_user| %>
<% if verified_user.email.present? %>
<li id="<%= dom_id(verified_user) %>_email" style="float:left">
<span style="float:left">
<%= mask_email(verified_user.email) %>
</span>
<span style="float:left;padding-left:30px">
<%= render 'form', url: email_path, verified_user: verified_user %>
</span>
<li id="<%= dom_id(verified_user) %>_email">
<span><%= mask_email(verified_user.email) %></span>
<span><%= render "form", url: email_path, verified_user: verified_user %></span>
</li>
<br/><br/><br/>
<% end %>
<% end %>
</ul>
<% end %>
<% if @verified_users.map(&:phone).any? %>
<div><strong><%= t('verification.verified_user.show.phone_title') %></strong></div>
<ul style="padding-top:40px">
<h2><%= t("verification.verified_user.show.phone_title") %></h2>
<ul class="verification-list">
<% @verified_users.each do |verified_user| %>
<% if verified_user.phone.present? %>
<li id="<%= dom_id(verified_user) %>_phone" style="float:left">
<span style="float:left">
<%= mask_phone(verified_user.phone) %>
</span>
<span style="float:left;padding-left:30px">
<%= render 'form', url: sms_path, verified_user: verified_user %>
</span>
<span><%= mask_phone(verified_user.phone) %></span>
<span><%= render "form", url: sms_path, verified_user: verified_user %></span>
</li>
<br/><br/><br/>
<% end %>
<% end %>
</ul>
<% end %>
<div style="margin-top: 30px">
<%= link_to t('verification.verified_user.show.use_another_phone'), new_sms_path %>
<div class="margin clear">
<%= link_to t("verification.verified_user.show.use_another_phone"), new_sms_path %>
</div>
</div>
</div>
</div>

View File

@@ -6,19 +6,21 @@ default: &default
username:
password:
development:
development: &development
<<: *default
database: participacion_development
# The staging, preproduction and production dbs are only needed
# for running rake assets:precompile locally before deploying
staging:
<<: *default
<<: *development
preproduction:
<<: *default
<<: *development
production:
<<: *default
<<: *development
test:
<<: *default
database: participacion_test
database: participacion_test

View File

@@ -6,4 +6,5 @@ set :ssh_options, port: deploysecret(:ssh_port)
set :stage, :production
set :rails_env, :production
server deploysecret(:server), user: deploysecret(:user), roles: %w(web app db importer)
server deploysecret(:server1), user: deploysecret(:user), roles: %w(web app db importer)
server deploysecret(:server2), user: deploysecret(:user), roles: %w(web app db importer)

View File

@@ -99,13 +99,18 @@ ignore_missing:
ignore_unused:
- 'activerecord.*'
- 'activemodel.*'
- 'admin.organizations.index.filter.*'
- 'unauthorized.*'
- 'simple_captcha.*'
- 'admin.officials.level_*'
- 'admin.comments.index.filter*'
- 'admin.debates.index.filter*'
- 'admin.organizations.index.filter*'
- 'admin.users.index.filter*'
- 'moderation.comments.index.filter*'
- 'moderation.debates.index.filter*'
- 'debates.index.orders.*'
- 'helpers.page_entries_info.*' # kaminari
- 'views.pagination.*' # kaminari
- 'debates.index.orders.*' #order filters for debates
# - '{devise,kaminari,will_paginate}.*'
# - 'simple_form.{yes,no}'
# - 'simple_form.{placeholders,hints,labels}.*'

View File

@@ -53,7 +53,8 @@ en:
back_link: "Back"
new:
title: "Sign up"
username_label: "Username to use publicly"
username_label: "Username"
username_note: "Username which will appear in your publications"
email_label: "Email"
password_label: "Password"
password_confirmation_label: "Confirm password"

View File

@@ -53,7 +53,8 @@ es:
back_link: "Atrás"
new:
title: "Registrarse"
username_label: "Nombre a utilizar públicamente"
username_label: "Nombre de usuario"
username_note: "Nombre que aparecerá en tus publicaciones"
email_label: "Email"
password_label: "Contraseña"
password_confirmation_label: "Confirmar contraseña"

View File

@@ -16,10 +16,10 @@ en:
open_city_slogan:
"Start listening to Madrid.
For that we open this digital Puerta del Sol, where all the locals can meet to discuss and share everything we want.
Also a place where you can talk directly with all the employees of the City of Madrid, from the Mayor to any officer."
Also a place where you can talk directly with all the employees of the City of Madrid, from the Mayor to any public employee of the City hall."
open_city_text:
"Here every voice has its place, and are citizens, and no one in their name, they decide to vote debates what issues are
most important of every time. Officials have individual users with whom you may participate in the debates, and evaluated,
"Here every voice has its place and are citizens, and no one in their name, they decide to vote debates what issues are
most important of every time. Government officials have individual users with whom you may participate in the debates, and evaluated,
the same level as everyone else. Because the Madrid City Council works for its citizens, and must respond to them."
open_city_soon: "And soon... we opened the section of citizen proposals."
see_all_debates: See all debates
@@ -28,25 +28,30 @@ en:
administration: Administration
moderation: Moderation
# welcome: Welcome
how_it_works: How it works
help: Help
more_information: "More information"
debates: Debates
# initiatives: Initiatives
footer:
description:
"The city you want, it will be the city you want. Get more information here on this page.
This Open Government Portal is %{open_source}, and code is in %{github_url}.
"The city you want, it will be the city you want. %{more_info} here on this page.
This Open Government Portal is %{open_source}, and code is in %{github}.
Madrid, for the whole world."
more_info: Get more information
more_info_url: "/more_information"
open_source: "software libre AGPLv3"
open_source_url: "http://www.gnu.org/licenses/agpl-3.0.html"
github: "github"
github_url: "https://github.com/ayuntamientomadrid"
copyright: "Ayuntamiento de Madrid, 2015. All rights reserved"
copyright: "Ayuntamiento de Madrid, %{year}"
participation_title: "Participation"
participation_text: Decide what should be the city of Madrid you want.
transparency_title: Transparency
transparency_text: Get any information on the City of Madrid.
open_data_title: Open Data
open_data_text: All City Council data are yours
open_data_text: "All City Council data are yours."
contact_us: "Contact us"
privacy: "Privacy Policy"
conditions: "Terms of use"
form:
error: error
errors: errors
@@ -54,21 +59,22 @@ en:
accept_terms: I accept the privacy policy and the legal terms
user: account
debate: debate
sms: phone
verification::sms: phone
application:
alert:
only_beta_testers: "Sorry only Beta Testers are allowed access at the moment"
debates:
index:
create_debate: Create a debate
start_debate: Start a debate
select_order: Order by
select_order_long: Order debates by
orders:
created_at: newest
total_votes: most voted
likes: best rated
select_topic: "Filter by topic:"
filter_topic: "You are seeing %{number} debates with the topic '%{topic}'"
all: All
filter_topic:
one: "You are seeing one debate with the topic '%{topic}'"
other: "You are seeing %{count} debates with the topic '%{topic}'"
debate:
debate: Debate
comments:
@@ -95,14 +101,13 @@ en:
other: "%{count} votes"
form:
debate_title: Debate title
title_instructions: "SBe clear and precise with the title, but make it informative"
debate_text: Ellaborate your opinion
text_instructions: "Explain your opinion, go into details, tell us what's the purpose of your idea"
debate_text: Initial text for debate
tags_label: Topics
tags_instructions: >
Tag this idea. You can choose among our proposals on the list or add any other topic you want by
Tag this debate. You can choose among our proposals on the list or add any other topic you want by
writing them separated by "," and then pressing "enter".
Some suggestions:
start_debate: Start a debate
show:
back_link: Back
author_deleted: Deleted user
@@ -119,7 +124,7 @@ en:
show_link: Show debate
back_link: Back
new:
publish_new: Publish new debate
start_new: Start a debate
back_link: Back
recommendations_title: Tips for creating a debate
recommendation_one: "On the Internet it is easy to say things you would not dare to say face to face. The tone of what you say you will be matched by a similar tone in the answers."
@@ -160,12 +165,12 @@ en:
phone_number_label: "Phone number"
organization_name_label: "Organization name"
notifications: Notifications
level_two_user: You are a level 2 user
level_three_user: You are a level 3 user
finish_verification: "Finish verification"
verified_account: Verified account
verify_my_account: Verify my account
simple_captcha:
placeholder: "Enter the image value"
label: "Enter the code in the box"
label: "Enter the image value in the next form"
refresh_button_text: "Refresh"
message:
user: "secret code did not match with the image"

View File

@@ -16,10 +16,10 @@ es:
open_city_slogan:
"Empecemos escuchando qué tiene que decir Madrid.
Para ello abrimos esta Puerta del Sol digital, donde todos los madrileños podemos encontrarnos para debatir y compartir todo lo que queramos.
También un espacio donde poder hablar directamente con todos los trabajadores del Ayuntamiento de Madrid, desde la Alcaldesa hasta cualquier funcionario."
También un espacio donde poder hablar directamente con todos los trabajadores del Ayuntamiento de Madrid, desde la Alcaldesa hasta cualquier trabajador público del Ayuntamiento."
open_city_text:
"Aquí cualquier voz tiene su espacio, y son los ciudadanos, y nadie en su nombre, los que deciden votando los debates cuáles son los temas
más importantes de cada momento. Los funcionarios tienen usuarios propios con los que podrán participar en los debates, y ser evaluados,
"Aquí cualquier voz tiene su espacio y son los ciudadanos, y nadie en su nombre, los que deciden votando los debates cuáles son los temas
más importantes de cada momento. Los responsables del gobierno tienen usuarios propios con los que podrán participar en los debates, y ser evaluados,
al mismo nivel que todos los demás. Porque el Ayuntamiento de Madrid trabaja para sus ciudadanos, y ante ellos debe responder."
open_city_soon: "Y muy pronto... abrimos la sección de propuestas ciudadanas."
see_all_debates: Ver todos los debates
@@ -28,25 +28,30 @@ es:
administration: Administrar
moderation: Moderar
# welcome: Portada
how_it_works: "Cómo funciona"
help: Ayuda
more_information: "Más información"
debates: Debates
# initiatives: Iniciativas
footer:
description:
"La ciudad que quieres, será la ciudad que quieras. Obtén aquí más información sobre esta página.
Este Portal de Gobierno Abierto es %{open_source}, y su código se encuentra en %{github_url}.
"La ciudad que quieres, será la ciudad que quieras. %{more_info} sobre esta página.
Este Portal de Gobierno Abierto es %{open_source}, y su código se encuentra en %{github}.
De Madrid, para el mundo entero."
more_info: Obtén más información
more_info_url: "/more_information"
open_source: "software libre AGPLv3"
open_source_url: "http://www.gnu.org/licenses/agpl-3.0.html"
github: "github"
github_url: "https://github.com/ayuntamientomadrid"
copyright: "Ayuntamiento de Madrid, %{year}. Todos los derechos reservados"
copyright: "Ayuntamiento de Madrid, %{year}"
participation_title: "Participación"
participation_text: "Decide cómo debe ser la ciudad de Madrid que quieres."
transparency_title: Transparencia
transparency_text: "Obtén cualquier información sobre el Ayuntamiento de Madrid."
open_data_title: Datos Abiertos
open_data_text: Todos los datos del Ayuntamiento son tuyos
open_data_text: "Todos los datos del Ayuntamiento son tuyos."
contact_us: "Contacta con nosotros en"
privacy: "Política de privacidad"
conditions: "Condiciones de uso"
form:
error: error
errors: errores
@@ -54,21 +59,22 @@ es:
accept_terms: Acepto la política de privacidad y el aviso legal
user: la cuenta
debate: el debate
sms: el teléfono
verification::sms: el teléfono
application:
alert:
only_beta_testers: "Lo sentimos sólo los usuarios de pruebas tienen acceso de momento"
debates:
index:
create_debate: Crea un debate
start_debate: Empieza un debate
select_order: Ordenar por
select_order_long: Estás viendo los debates
orders:
created_at: "más nuevos"
total_votes: "más votados"
likes: mejor valorados
select_topic: "Filtrar por tema:"
filter_topic: "Estás viendo %{number} debates con el tema '%{topic}'"
all: Todos
likes: "mejor valorados"
filter_topic:
one: "Estás viendo un debate con el tema ''%{topic}''"
other: "Estás viendo %{count} debates con el tema '%{topic}'"
debate:
debate: Debate
comments:
@@ -95,14 +101,13 @@ es:
other: "%{count} votos"
form:
debate_title: Título del debate
title_instructions: "Sé claro y conciso a la hora de poner un título, pero recuerda que debe explicar bien tu idea, ¡es tu carta de entrada!"
debate_text: Describe tu opinión
text_instructions: "Explica con todo el detalle que puedas y de una manera sencilla la idea y que crees que conseguiríamos con ella"
debate_text: Texto inicial del debate
tags_label: Temas
tags_instructions: >
Etiqueta esta idea. Puedes elegir entre nuestras propuestas o introducir las que desees.
Etiqueta este debate. Puedes elegir entre nuestras propuestas o introducir las que desees.
Para ello solo tienes que escribir las etiquetas que desees separadas por "," y pulsar "intro".
Algunas recomendaciones:
start_debate: Empieza un debate
show:
back_link: Volver
author_deleted: Usuario eliminado
@@ -119,7 +124,7 @@ es:
show_link: Ver debate
back_link: Volver
new:
publish_new: Publicar debate nuevo
start_new: Empezar un debate
back_link: Volver
recommendations_title: Recomendaciones para crear un debate
recommendation_one: "En internet es fácil decir cosas que uno no se atrevería a decir cara a cara. El tono de lo que digas será correspondido con un tono similar en las respuestas."
@@ -160,12 +165,12 @@ es:
phone_number_label: "Teléfono"
organization_name_label: "Nombre de la organización"
notifications: Notificaciones
level_two_user: Eres un usuario verificado de nivel 2
level_three_user: Eres un usuario verificado de nivel 3
finish_verification: "Finalizar verificación"
verified_account: Cuenta verificada
verify_my_account: Verificar mi cuenta
simple_captcha:
placeholder: "Introduce el texto de la imagen"
label: "Introduce el texto en la caja"
label: "Introduce el texto de la imagen en la siguiente caja"
refresh_button_text: "Refrescar"
message:
user: "el código secreto no coincide con la imagen"

View File

@@ -1,9 +1,9 @@
en:
pages:
legal:
"Legal"
conditions:
"Terms of use"
privacy:
"Privacy"
"Privacy Policy"
general_terms:
"Terms and Conditions"
census_terms:

View File

@@ -1,9 +1,9 @@
es:
pages:
legal:
"Legal"
conditions:
"Condiciones de uso"
privacy:
"Privacidad"
"Política de Privacidad"
general_terms:
"Términos y Condiciones"
census_terms:

View File

@@ -1,49 +1,59 @@
en:
verification:
step_1: "1. Residence"
step_2: "2. Confirmation code"
step_3: "3. Final verification"
residence:
new:
title: 'Verify residence'
title: "Verify residence"
document_type_label: "Document type"
document_type:
spanish_id: 'Spanish ID'
passport: 'Passport'
residence_card: 'Residence card'
accept_terms_text: "I accept the terms to access the city Census"
accept_terms_link: "Read terms"
form_errors: 'prevented your residence verification'
error_verifying_census: 'The census of the city of Madrid could not verify your information. Pero revise de information and try again or get in touch with us.'
spanish_id: "Spanish ID"
passport: "Passport"
residence_card: "Residence card"
document_number: "Document number"
date_of_birth: "Date of birth"
postal_code: "Postal code"
accept_terms_text: "I accept %{terms_url} to access the city Census"
terms: "the terms"
verify_residence: "Verify residence"
form_errors: "prevented your residence verification"
error_verifying_census: "The census of the city of Madrid could not verify your information. Pero revise de information and try again or get in touch with us."
create:
flash:
success: 'Residence verified'
success: "Residence verified"
alert:
verify_attemps_left: 'You have reached the maximum number of Census verification tries'
unconfirmed_residency: 'You have not yet confirmed your residence'
verify_attemps_left: "You have reached the maximum number of Census verification tries"
unconfirmed_residency: "You have not yet confirmed your residence"
sms:
new:
title: Phone verification
submit_button: Send
title: "Phone verification"
phone: "Enter your phone for recive the code"
submit_button: "Send"
create:
flash:
success: 'Enter the confirmation code we have sent your phone'
success: "Enter the confirmation code we have sent your phone"
edit:
title: Security code confirmation
resend_sms_text: You have not received the confirmation code in your phone?
resend_sms_link: Click here to send the confirmation code again
submit_button: Send
title: "Security code confirmation"
confirmation_code: "Code confirmation"
resend_sms_text: "You have not received the confirmation code in your phone?"
resend_sms_link: "Click here to send the confirmation code again"
submit_button: "Send"
update:
error: 'Incorrect confirmation code'
error: "Incorrect confirmation code"
flash:
level_three:
success: 'Correct code. You are now a verified user'
success: "Correct code. Your account is verified"
level_two:
success: 'Correct code'
success: "Correct code"
alert:
verify_attemps_left: 'You have reached the maximum number of sms verification tries'
verify_attemps_left: "You have reached the maximum number of sms verification tries"
email:
show:
flash:
success: 'You are now a verified user'
success: "You are now a verified user"
alert:
failure: 'Incorrect verification code'
failure: "Incorrect verification code"
create:
flash:
success: "We have send you a confirmation email to your email account: %{email}"
@@ -51,21 +61,33 @@ en:
failure: "There was a problem sending you an email to your account"
letter:
new:
title: Final Verification
explanation: 'To completely verify your account we need to go to one of these offices or send you a letter with a special code to your home address'
submit_button: 'Send me a letter'
title: "Final Verification"
explanation_html:
"<p>Congratulations! You can now participate in discussions or support proposals of others.</p><p>To finish we need to verify your account completely provide you with a <b>maximum security code</b>, we ensure that no one is using your data on your behalf.</p><p>This requirement is essential to participate in final votes on motions. This can approach any <b>Office of Citizen</b> where you will verify in person, or in case you is impossible, we can send you a letter home with the code.</p>"
offices: "See Office of Citizen"
offices_url: "http://www.madrid.es/portales/munimadrid/es/Inicio/El-Ayuntamiento/Atencion-al-ciudadano/Oficinas-de-Atencion-al-Ciudadano?vgnextfmt=default&vgnextchannel=5b99cde2e09a4310VgnVCM1000000b205a0aRCRD"
send_letter: "Send me a letter with the code"
send_code: "Send"
create:
flash:
success: "You will receive a letter to your home address in the next couple of days"
success: "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data. Remember that you can save shipping collecting your code in any of the Office of Citizen Services."
alert:
failure: "We could not verify your address with the Census please try again later"
edit:
title: "Security code confirmation"
confirmation_code: "Enter the security code in your letter"
update:
error: "Incorrect confirmation code"
flash:
success: "Correct code. Your account is verified"
alert:
unconfirmed_personal_data: 'You have not yet confirmed your personal data'
unconfirmed_code: "You have not yet enter the confirmation code"
verified_user:
show:
title: Available information
email_title: Emails
phone_title: Phones
use_another_phone: Use another phone
title: "Available information"
explanation: "We currently have the following data in the Census, choose where you want to send the confirmation code."
email_title: "Emails"
phone_title: "Phones"
use_another_phone: "Use another phone"
form:
submit_button: Send
submit_button: "Send code"

View File

@@ -1,49 +1,59 @@
es:
verification:
step_1: "1. Residencia"
step_2: "2. Código de confirmación"
step_3: "3. Verificación final"
residence:
new:
title: 'Verificar residencia'
title: "Verificar residencia"
document_type_label: "Tipo de documento"
document_type:
spanish_id: 'DNI'
passport: 'Pasaporte'
residence_card: 'Tarjeta de residencia'
accept_terms_text: "Acepto los terminos de acceso al Padrón"
accept_terms_link: "Leer términos"
form_errors: 'evitaron verificar tu residencia'
error_verifying_census: 'El Padrón de Madrid no pudo verificar tu información. Revisa la información ó ponte en contacto con nosotros.'
spanish_id: "DNI"
passport: "Pasaporte"
residence_card: "Tarjeta de residencia"
document_number: "Número de documento"
date_of_birth: "Fecha de nacimiento"
postal_code: "Código postal"
accept_terms_text: "Acepto %{terms_url} al Padrón"
terms: "los terminos de acceso"
verify_residence: "Verificar residencia"
form_errors: "evitaron verificar tu residencia"
error_verifying_census: "El Padrón de Madrid no pudo verificar tu información. Revisa la información ó ponte en contacto con nosotros."
create:
flash:
success: 'Residencia verificada'
success: "Residencia verificada"
alert:
verify_attemps_left: 'Has llegado al máximo número de intentos de verificar tu residencia.'
unconfirmed_residency: 'Aún no has verificado tu residencia'
verify_attemps_left: "Has llegado al máximo número de intentos de verificar tu residencia."
unconfirmed_residency: "Aún no has verificado tu residencia"
sms:
new:
title: Verificación de teléfono móvil
submit_button: Enviar
title: "Recibir código de confirmación"
phone: "Introduce tu teléfono móvil para recibir el código"
submit_button: "Enviar"
create:
flash:
success: 'Introduce el código de confirmación que te hemos enviado por mensaje de texto'
success: "Introduce el código de confirmación que te hemos enviado por mensaje de texto"
edit:
title: 'Confirmación de código de seguridad'
resend_sms_text: '¿No has recibido un mensaje de texto con tu código de confirmación?'
resend_sms_link: 'Haz click aquí para volver a enviártelo'
submit_button: Enviar
title: "Confirmación de código de seguridad"
confirmation_code: "Introduce el código que has recibido en tu móvil"
resend_sms_text: "¿No has recibido un mensaje de texto con tu código de confirmación?"
resend_sms_link: "Haz click aquí para volver a enviártelo"
submit_button: "Enviar"
update:
error: 'Código de confirmación incorrecto'
error: "Código de confirmación incorrecto"
flash:
level_three:
success: 'Código correcto. Ya eres un usuario verificado'
success: "Código correcto. Tu cuenta ya está verificada"
level_two:
success: 'Código incorrecto'
success: "Código correcto"
alert:
verify_attemps_left: 'Has llegado al máximo número de intentos de verificar tu teléfono.'
verify_attemps_left: "Has llegado al máximo número de intentos de verificar tu teléfono."
email:
show:
flash:
success: 'Eres un usuario verificado'
success: "Eres un usuario verificado"
alert:
failure: 'Código de verificación incorrecto'
failure: "Código de verificación incorrecto"
create:
flash:
success: "Te hemos enviado un email de confirmación a tu cuenta: %{email}"
@@ -51,21 +61,33 @@ es:
failure: "Hubo un problema enviándote un email a tu cuenta"
letter:
new:
title: Final Verification
explanation: 'To completely verify your account we need to go to one of these offices or send you a letter with a special code to your home address'
submit_button: 'Send me a letter'
title: "Verificación Final"
explanation_html:
"<p>¡Felicidades! Ya puedes participar en debates o apoyar propuestas de otras personas.</p><p>Para terminar de verificar tu cuenta completamente necesitamos proporcionarte un <b>código de máxima seguridad</b>, que nos asegure que nadie está utilizando tus datos en tu nombre.</p><p>Este requerimiento es esencial para participar en las votaciones finales de las propuestas. Para ello puedes acercarte a cualquier <b>Oficina de Atención al Ciudadano</b> donde te verificarán presencialmente, o en caso de que te sea imposible, podemos mandarte una carta a casa con el código.</p>"
offices: "Ver Oficinas de Atención al Ciudadano"
offices_url: "http://www.madrid.es/portales/munimadrid/es/Inicio/El-Ayuntamiento/Atencion-al-ciudadano/Oficinas-de-Atencion-al-Ciudadano?vgnextfmt=default&vgnextchannel=5b99cde2e09a4310VgnVCM1000000b205a0aRCRD"
send_letter: "Enviarme una carta con el código"
send_code: "Enviar"
create:
flash:
success: "You will receive a letter to your home address in the next couple of days"
success: "Gracias por solicitar tu código de máxima seguridad, en unos días te lo enviaremos a la dirección que figura en tus datos del padrón. Recuerda que puedes ahorrar el envío recogiendo tu código en cualquiera de las Oficinas de Atención al Ciudadano."
alert:
failure: "We could not verify your address with the Census please try again later"
failure: "No podemos verificar tu dirección con el Padrón, por favor inténtalo otra vez más tarde"
edit:
title: "Confirmación de código de seguridad"
confirmation_code: "Introduce el código que has recibido en tu carta"
update:
error: "Código de verificación incorrecto"
flash:
success: "Código correcto. Tu cuenta ya está verificada"
alert:
unconfirmed_personal_data: 'You have not yet confirmed your personal data'
unconfirmed_code: "Todavía no has introducido el código de confirmación"
verified_user:
show:
title: Información disponible
email_title: Emails
phone_title: Teléfonos
use_another_phone: Utilizar otro teléfono
title: "Información disponible"
explanation: "Actualmente disponemos de los siguientes datos en el Padrón, selecciona donde quieres que enviemos el código de confirmación."
email_title: "Emails"
phone_title: "Teléfonos"
use_another_phone: "Utilizar otro teléfono"
form:
submit_button: Enviar
submit_button: "Enviar código"

View File

@@ -48,7 +48,7 @@ Rails.application.routes.draw do
resource :sms, controller: "sms", only: [:new, :create, :edit, :update]
resource :verified_user, controller: "verified_user", only: [:show]
resource :email, controller: "email", only: [:new, :show, :create]
resource :letter, controller: "letter", only: [:new, :create]
resource :letter, controller: "letter", only: [:new, :create, :edit, :update]
end
namespace :admin do

View File

@@ -0,0 +1,5 @@
class AddLetterVerificationCodeToUsers < ActiveRecord::Migration
def change
add_column :users, :letter_verification_code, :string
end
end

View File

@@ -65,6 +65,7 @@ ActiveRecord::Schema.define(version: 20150903142924) do
t.datetime "created_at"
t.datetime "updated_at"
t.datetime "hidden_at"
t.integer "children_count", default: 0
t.integer "flags_count", default: 0
t.datetime "ignored_flag_at"
t.integer "moderator_id"
@@ -90,8 +91,8 @@ ActiveRecord::Schema.define(version: 20150903142924) do
t.integer "author_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "hidden_at"
t.string "visit_id"
t.datetime "hidden_at"
t.integer "flags_count", default: 0
t.datetime "ignored_flag_at"
t.integer "cached_votes_total", default: 0
@@ -198,13 +199,12 @@ ActiveRecord::Schema.define(version: 20150903142924) do
t.string "unconfirmed_email"
t.boolean "email_on_debate_comment", default: false
t.boolean "email_on_comment_reply", default: false
t.string "phone_number", limit: 30
t.string "official_position"
t.integer "official_level", default: 0
t.datetime "hidden_at"
t.string "phone_number", limit: 30
t.string "username"
t.datetime "confirmed_hide_at"
t.string "sms_confirmation_code"
t.string "username"
t.string "document_number"
t.string "document_type"
t.datetime "residence_verified_at"
@@ -216,6 +216,8 @@ ActiveRecord::Schema.define(version: 20150903142924) do
t.string "unconfirmed_phone"
t.string "confirmed_phone"
t.datetime "letter_requested_at"
t.datetime "confirmed_hide_at"
t.string "letter_verification_code"
end
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree

View File

@@ -1,3 +1,7 @@
# Default admin user (change password after first deploy to a server!)
admin = User.create!(username: 'admin', email: 'admin@madrid.es', password: '12345678', password_confirmation: '12345678', confirmed_at: Time.now)
admin.create_administrator
# Names for the moderation console, as a hint for moderators
# to know better how to assign users with official positions
Setting.create(key: 'official_level_1_name', value: 'Empleados públicos')
@@ -7,4 +11,4 @@ Setting.create(key: 'official_level_4_name', value: 'Concejales')
Setting.create(key: 'official_level_5_name', value: 'Alcaldesa')
# Max percentage of allowed anonymous votes on a debate
Setting.create(key: 'max_ratio_anon_votes_on_debates', value: '50')
Setting.create(key: 'max_ratio_anon_votes_on_debates', value: '50')

View File

@@ -1,8 +1,4 @@
class ApplicationResponder < ActionController::Responder
include Responders::FlashResponder
include Responders::HttpCacheResponder
# Redirects resources to the collection path (index action) instead
# of the resource path (show action) for POST/PUT/DELETE requests.
# include Responders::CollectionResponder
end

View File

@@ -0,0 +1,37 @@
require 'rails_helper'
describe 'HasFilters' do
class FakeController < ActionController::Base; end
controller(FakeController) do
include HasFilters
has_filters ['all', 'pending', 'reviewed'], only: :index
def index
render text: "#{@current_filter} (#{@valid_filters.join(' ')})"
end
end
it "has the valid filters set up" do
get :index
expect(response.body).to eq('all (all pending reviewed)')
end
describe "the current filter" do
it "defaults to the first one on the list" do
get :index
expect(response.body).to eq('all (all pending reviewed)')
end
it "can be changed by the filter param" do
get :index, filter: 'pending'
expect(response.body).to eq('pending (all pending reviewed)')
end
it "defaults to the first one on the list if given a bogus filter" do
get :index, filter: 'foobar'
expect(response.body).to eq('all (all pending reviewed)')
end
end
end

View File

@@ -8,8 +8,8 @@ describe PagesController do
expect(response).to be_ok
end
it 'should include a legal page' do
get :legal
it 'should include a conditions page' do
get :conditions
expect(response).to be_ok
end

View File

@@ -29,7 +29,7 @@ feature 'Admin officials' do
expect(page).to have_content @official.email
fill_in 'user_official_position', with: 'School Teacher'
select '3', from: 'user_official_level'
select '3', from: 'user_official_level', exact: false
click_button 'Update User'
expect(page).to have_content 'Official position saved!'
@@ -52,7 +52,7 @@ feature 'Admin officials' do
click_link @citizen.name
fill_in 'user_official_position', with: 'Hospital manager'
select '4', from: 'user_official_level'
select '4', from: 'user_official_level', exact: false
click_button 'Update User'
expect(page).to have_content 'Official position saved!'
@@ -75,4 +75,4 @@ feature 'Admin officials' do
expect(page).to_not have_content @citizen.name
expect(page).to_not have_content @official.name
end
end
end

View File

@@ -31,7 +31,7 @@ feature 'Comments' do
expect(page).to have_content("1")
expect(page).to have_content("2")
expect(page).to_not have_content("3")
click_link "Next"
click_link "Next", exact: false
end
expect(page).to have_css('.comment', count: 2)

View File

@@ -28,7 +28,7 @@ feature 'Debates' do
expect(page).to have_content("1")
expect(page).to have_content("2")
expect(page).to_not have_content("3")
click_link "Next"
click_link "Next", exact: false
end
expect(page).to have_selector('#debates .debate', count: 2)
@@ -60,7 +60,7 @@ feature 'Debates' do
fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service'
click_button 'Create Debate'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully created.'
expect(page).to have_content 'Acabar con los desahucios'
@@ -78,13 +78,13 @@ feature 'Debates' do
fill_in 'debate_captcha', with: "wrongText!"
check 'debate_terms_of_service'
click_button "Create Debate"
click_button "Start a debate"
expect(page).to_not have_content "Debate was successfully created."
expect(page).to have_content "1 error"
fill_in 'debate_captcha', with: correct_captcha_text
click_button "Create Debate"
click_button "Start a debate"
expect(page).to have_content "Debate was successfully created."
end
@@ -100,7 +100,7 @@ feature 'Debates' do
fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service'
click_button "Create Debate"
click_button "Start a debate"
expect(page).to_not have_content "Debate was successfully created."
expect(page).to have_content "1 error"
@@ -115,7 +115,7 @@ feature 'Debates' do
login_as(author)
visit new_debate_path
click_button 'Create Debate'
click_button 'Start a debate'
expect(page).to have_content error_message
end
@@ -129,7 +129,7 @@ feature 'Debates' do
fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service'
click_button 'Create Debate'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully created.'
expect(page).to have_content 'A test'
@@ -161,7 +161,7 @@ feature 'Debates' do
find('.js-add-tag-link', text: tag_name).click
end
click_button 'Create Debate'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully created.'
['Medio Ambiente', 'Ciencia'].each do |tag_name|
@@ -179,7 +179,7 @@ feature 'Debates' do
fill_in 'debate_tag_list', with: 'user_id=1, &a=3, <script>alert("hey");</script>'
click_button 'Create Debate'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully created.'
expect(page).to have_content 'user_id1'
@@ -222,7 +222,7 @@ feature 'Debates' do
fill_in 'debate_description', with: "Let's..."
fill_in 'debate_captcha', with: correct_captcha_text
click_button "Update Debate"
click_button "Start a debate"
expect(page).to have_content "Debate was successfully updated."
expect(page).to have_content "End child poverty"
@@ -235,7 +235,7 @@ feature 'Debates' do
visit edit_debate_path(debate)
fill_in 'debate_title', with: ""
click_button 'Update Debate'
click_button 'Start a debate'
expect(page).to have_content error_message
end
@@ -249,13 +249,13 @@ feature 'Debates' do
fill_in 'debate_title', with: "New title"
fill_in 'debate_captcha', with: "wrong!"
click_button "Update Debate"
click_button "Start a debate"
expect(page).to_not have_content "Debate was successfully updated."
expect(page).to have_content "1 error"
fill_in 'debate_captcha', with: correct_captcha_text
click_button "Update Debate"
click_button "Start a debate"
expect(page).to have_content "Debate was successfully updated."
end
@@ -271,7 +271,7 @@ feature 'Debates' do
fill_in 'debate_title', with: ""
fill_in 'debate_captcha', with: correct_captcha_text
click_button "Update Debate"
click_button "Start a debate"
expect(page).to_not have_content "Debate was successfully updated."
expect(page).to have_content "1 error"
@@ -407,34 +407,4 @@ feature 'Debates' do
expect(@most_liked_debate.title).to appear_before(@most_voted_debate.title)
end
end
feature 'Debates can be filtered by tags', :js do
let!(:debate1) { create(:debate, tag_list: ["Deporte", "Corrupción"]) }
let!(:debate2) { create(:debate, tag_list: ["Deporte", "Fiestas populares"]) }
let!(:debate3) { create(:debate, tag_list: ["Corrupción", "Fiestas populares"]) }
scenario 'By default no tag filter is applied' do
visit debates_path
expect(page).to have_content('Filter by topic')
expect(page).not_to have_content('with the topic')
expect(page).to have_selector('#debates .debate', count: 3)
end
scenario 'Debates are filtered by single tag' do
visit debates_path
select('Deporte', from: 'tag-filter')
expect(page).not_to have_content('Filter by topic')
expect(page).not_to have_select('tag-filter')
expect(page).to have_content('with the topic')
expect(current_url).to include('tag=Deporte')
expect(page).to have_selector('#debates .debate', count: 2)
expect(page).to_not have_content(debate3.title)
expect(page).to have_content(debate1.title)
expect(page).to have_content(debate2.title)
end
end
end

View File

@@ -32,7 +32,7 @@ feature 'Organizations' do
scenario 'Shared links' do
visit new_user_registration_path
expect(page).to have_link "Sign up as an organization"
expect(page).to have_link "Sign up as an organization / collective"
visit new_organization_registration_path
expect(page).to have_link "Sign up"

View File

@@ -72,7 +72,7 @@ feature 'Tags' do
fill_in 'debate_tag_list', with: "Impuestos, Economía, Hacienda"
click_button 'Create Debate'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully created.'
expect(page).to have_content 'Economía'
@@ -90,7 +90,7 @@ feature 'Tags' do
fill_in 'debate_tag_list', with: "Economía, Hacienda"
fill_in 'debate_captcha', with: correct_captcha_text
click_button 'Update Debate'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully updated.'
within('.tags') do
@@ -107,7 +107,7 @@ feature 'Tags' do
fill_in 'debate_tag_list', with: ""
fill_in 'debate_captcha', with: correct_captcha_text
click_button 'Update Debate'
click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully updated.'
expect(page).to_not have_content 'Economía'

View File

@@ -19,7 +19,7 @@ feature 'Verify email' do
within("#verified_user_#{verified_user.id}_email") do
expect(page).to have_content 'roc*@example.com'
click_button "Send"
click_button "Send code"
end
expect(page).to have_content 'We have send you a confirmation email to your email account: rock@example.com'
@@ -30,7 +30,7 @@ feature 'Verify email' do
expect(page).to have_content "You are now a verified user"
expect(page).to_not have_link "Verify my account"
expect(page).to have_content "You are a level 3 user"
expect(page).to have_content "Verified account"
end
scenario "Errors on token verification" do
@@ -58,7 +58,7 @@ feature 'Verify email' do
visit verified_user_path
verified_user.destroy
click_button "Send"
click_button "Send code"
expect(page).to have_content "There was a problem sending you an email to your account"
end

View File

@@ -2,15 +2,45 @@ require 'rails_helper'
feature 'Verify Letter' do
scenario 'Send letter level 2 verified with phone' do
scenario 'Verify' do
user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111")
login_as(user)
visit new_letter_path
click_button "Send me a letter"
click_button "Send me a letter with the code"
expect(page).to have_content "You will receive a letter to your home address"
expect(page).to have_content "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data."
user.reload
fill_in "letter_verification_code", with: user.letter_verification_code
click_button "Send"
expect(page).to have_content "Correct code. Your account is verified"
end
scenario 'Go to office instead of send letter' do
user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111")
login_as(user)
visit new_letter_path
expect(page).to have_link "See Office of Citizen", href: "http://www.madrid.es/portales/munimadrid/es/Inicio/El-Ayuntamiento/Atencion-al-ciudadano/Oficinas-de-Atencion-al-Ciudadano?vgnextfmt=default&vgnextchannel=5b99cde2e09a4310VgnVCM1000000b205a0aRCRD"
end
scenario 'Errors on verification code' do
user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111")
login_as(user)
visit new_letter_path
click_button "Send me a letter with the code"
expect(page).to have_content "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data."
fill_in "letter_verification_code", with: "1"
click_button "Send"
expect(page).to have_content "Incorrect confirmation code"
end
scenario "Error accessing address from CensusApi" do
@@ -21,22 +51,11 @@ feature 'Verify Letter' do
allow_any_instance_of(CensusApi).to receive(:address).and_return(nil)
click_button "Send me a letter"
click_button "Send me a letter with the code"
expect(page).to have_content "We could not verify your address with the Census please try again later"
end
scenario 'Send letter level 2 user verified with email' do
user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111")
login_as(user)
visit new_letter_path
click_button "Send me a letter"
expect(page).to have_content "You will receive a letter to your home address"
end
scenario "Deny access unless verified residence" do
user = create(:user)
@@ -53,7 +72,7 @@ feature 'Verify Letter' do
login_as(user)
visit new_letter_path
expect(page).to have_content 'You have not yet confirmed your personal data'
expect(page).to have_content 'You have not yet enter the confirmation code'
expect(URI.parse(current_url).path).to eq(new_sms_path)
end

View File

@@ -17,7 +17,7 @@ feature 'Level three verification' do
verify_residence
within("#verified_user_#{verified_user.id}_phone") do
click_button "Send"
click_button "Send code"
end
expect(page).to have_content 'Security code confirmation'
@@ -26,12 +26,10 @@ feature 'Level three verification' do
fill_in 'sms_confirmation_code', with: user.sms_confirmation_code
click_button 'Send'
expect(page).to have_content 'Correct code'
expect(page).to have_content "You are now a verified user"
expect(page).to have_content "Correct code. Your account is verified"
expect(page).to_not have_link "Verify my account"
expect(page).to have_content "You are a level 3 user"
expect(page).to have_content "Verified account"
end
scenario 'Verification with residency and verified email' do
@@ -50,7 +48,7 @@ feature 'Level three verification' do
verify_residence
within("#verified_user_#{verified_user.id}_email") do
click_button "Send"
click_button "Send code"
end
expect(page).to have_content 'We have send you a confirmation email to your email account: rock@example.com'
@@ -61,7 +59,7 @@ feature 'Level three verification' do
expect(page).to have_content "You are now a verified user"
expect(page).to_not have_link "Verify my account"
expect(page).to have_content "You are a level 3 user"
expect(page).to have_content "Verified account"
end
scenario 'Verification with residency and sms and letter' do
@@ -85,8 +83,14 @@ feature 'Level three verification' do
expect(page).to have_content 'Correct code'
click_button "Send me a letter"
click_button "Send me a letter with the code"
expect(page).to have_content "You will receive a letter to your home address"
expect(page).to have_content "Thank you for requesting a maximum security code in a few days we will send it to the address on your census data."
user.reload
fill_in "letter_verification_code", with: user.letter_verification_code
click_button "Send"
expect(page).to have_content "Correct code. Your account is verified"
end
end

View File

@@ -15,7 +15,7 @@ feature 'Residence' do
fill_in 'residence_postal_code', with: '28013'
check 'residence_terms_of_service'
click_button 'Verify'
click_button 'Verify residence'
expect(page).to have_content 'Residence verified'
end
@@ -27,7 +27,7 @@ feature 'Residence' do
visit account_path
click_link 'Verify my account'
click_button 'Verify'
click_button 'Verify residence'
expect(page).to have_content /\d errors? prevented your residence verification/
end
@@ -47,7 +47,7 @@ feature 'Residence' do
fill_in 'residence_postal_code', with: '28013'
check 'residence_terms_of_service'
click_button 'Verify'
click_button 'Verify residence'
expect(page).to have_content 'The census of the city of Madrid could not verify your information'
end
@@ -68,11 +68,11 @@ feature 'Residence' do
fill_in 'residence_postal_code', with: '28013'
check 'residence_terms_of_service'
click_button 'Verify'
click_button 'Verify residence'
expect(page).to have_content 'The census of the city of Madrid could not verify your information'
end
click_button 'Verify'
click_button 'Verify residence'
expect(page).to have_content 'You have reached the maximum number of Census verification tries'
expect(URI.parse(current_url).path).to eq(account_path)

View File

@@ -73,7 +73,7 @@ feature 'Verified users' do
visit verified_user_path
within("#verified_user_#{verified_user.id}_email") do
click_button "Send"
click_button "Send code"
end
expect(page).to have_content 'We have send you a confirmation email to your email account: rock@example.com'
@@ -95,7 +95,7 @@ feature 'Verified users' do
visit verified_user_path
within("#verified_user_#{verified_user.id}_phone") do
click_button "Send"
click_button "Send code"
end
expect(page).to have_content 'Enter the confirmation code'

View File

@@ -174,21 +174,6 @@ describe Debate do
end
end
describe "#search" do
let!(:economy) { create(:debate, tag_list: "Economy") }
let!(:health) { create(:debate, tag_list: "Health") }
it "returns debates tagged with params tag" do
params = {tag: "Economy"}
expect(Debate.search(params)).to match_array([economy])
end
it "returns all debates if no parameters" do
params = {}
expect(Debate.search(params)).to match_array([economy, health])
end
end
describe '#default_order' do
let!(:economy) { create(:debate) }
let!(:health) { create(:debate) }

View File

@@ -22,5 +22,6 @@ RSpec.configure do |config|
end
Capybara.javascript_driver = :poltergeist
Capybara.exact = true
OmniAuth.config.test_mode = true

View File

@@ -106,7 +106,7 @@ module CommonActions
fill_in 'residence_postal_code', with: '28013'
check 'residence_terms_of_service'
click_button 'Verify'
click_button 'Verify residence'
expect(page).to have_content 'Residence verified'
end
end