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 // 14. Tables
// 15. Social // 15. Social
// 16. Pages // 16. Pages
// 17. Verification
// //
// 01. Variables // 01. Variables
@@ -126,6 +127,7 @@ h6 {
} }
.button { .button {
font-size: rem-calc(13);
padding: rem-calc(15) rem-calc(32); padding: rem-calc(15) rem-calc(32);
} }
@@ -221,6 +223,11 @@ h6 {
} }
} }
.progress {
background-color: rgba(0,0,0,.06);
border: 0;
}
// 04. Header // 04. Header
// - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -229,7 +236,7 @@ header {
background-position: 50% 50%; background-position: 50% 50%;
background-size: cover; background-size: cover;
color: $text; color: $text;
min-height: rem-calc(600); min-height: rem-calc(624);
&.results { &.results {
min-height: rem-calc(48); min-height: rem-calc(48);
@@ -543,9 +550,14 @@ footer {
a { a {
color: white; color: white;
&.link:hover { &:hover {
color: white; color: white;
opacity: .5; opacity: .5;
transition: opacity 275ms;
}
&:active, &:focus {
color: white;
} }
} }
@@ -554,7 +566,14 @@ footer {
text-decoration: underline; text-decoration: underline;
&:hover { &: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 // 09. Alerts
// - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -847,22 +873,8 @@ form {
margin-right: rem-calc(12); margin-right: rem-calc(12);
} }
.date {
select {
float: left;
width: 25%;
}
}
.verify-account { .verify-account {
padding-right: rem-calc(12); padding-right: rem-calc(12);
.verified {
color: $check;
font-weight: bold;
line-height: rem-calc(42);
}
} }
} }
@@ -1122,13 +1134,23 @@ table {
.page { .page {
background: white; background: white;
min-height: 100%; min-height: rem-calc(600);
.menu { .menu {
margin-top: rem-calc(24); margin-top: rem-calc(24);
ul {
list-style-type: none;
margin-left: 0;
& ul {
margin-left: rem-calc(12);
}
}
a { a {
display: block; display: block;
font-size: rem-calc(13);
margin-bottom: rem-calc(12); margin-bottom: rem-calc(12);
} }
} }
@@ -1137,7 +1159,12 @@ table {
margin-top: rem-calc(24); margin-top: rem-calc(24);
text-align: justify; text-align: justify;
ul { h1, h2, h3, h4, h5, h6 {
text-align: left;
}
ul, ol {
margin-left: rem-calc(12);
li { li {
font-size: rem-calc(13); 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 class AccountController < ApplicationController
before_action :authenticate_user! before_action :authenticate_user!
before_action :set_account before_action :set_account
load_and_authorize_resource class: "User" load_and_authorize_resource class: "User"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,29 +1,28 @@
require "application_responder" require "application_responder"
class ApplicationController < ActionController::Base 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 include SimpleCaptcha::ControllerHelpers
self.responder = ApplicationResponder include HasFilters
respond_to :html
before_action :set_locale before_action :authenticate_http_basic
layout :set_layout before_action :authenticate_user!, unless: :devise_controller?, if: :beta_site?
before_action :authenticate_beta_tester!, unless: :devise_controller?, if: :beta_site?
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_action :ensure_signup_complete 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| rescue_from CanCan::AccessDenied do |exception|
redirect_to main_app.root_url, alert: exception.message redirect_to main_app.root_url, alert: exception.message
end end
layout :set_layout
respond_to :html
private private
def authenticate_http_basic 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 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] before_action :authenticate_user!, except: [:index, :show]
load_and_authorize_resource load_and_authorize_resource
respond_to :html, :js respond_to :html, :js
def index def index
@debates = Debate.search(params).page(params[:page]).for_render.send("sort_by_#{@order}") @debates = Debate.all
@tags = ActsAsTaggableOn::Tag.all @debates = @debates.tagged_with(@tag_filter) if @tag_filter
@tag_cloud = Debate.tag_counts.order('count desc, name asc') @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) set_debate_votes(@debates)
end end
@@ -85,8 +87,9 @@ class DebatesController < ApplicationController
end end
def parse_tag_filter def parse_tag_filter
valid_tags = ActsAsTaggableOn::Tag.all.map(&:name) if params[:tag].present?
@tag_filter = params[:tag] if valid_tags.include?(params[:tag]) @tag_filter = params[:tag] if ActsAsTaggableOn::Tag.where(name: params[:tag]).exists?
end
end end
end end

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
class Users::RegistrationsController < Devise::RegistrationsController 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 def create
build_resource(sign_up_params) build_resource(sign_up_params)

View File

@@ -1,7 +1,7 @@
class Verification::LetterController < ApplicationController class Verification::LetterController < ApplicationController
before_action :authenticate_user! before_action :authenticate_user!
before_action :verify_resident! before_action :verify_resident!
before_action :verify_phone_or_email! before_action :verify_phone!
skip_authorization_check skip_authorization_check
def new def new
@@ -11,22 +11,37 @@ class Verification::LetterController < ApplicationController
def create def create
@letter = Verification::Letter.new(user: current_user) @letter = Verification::Letter.new(user: current_user)
if @letter.save 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 else
flash.now.alert = t('verification.letter.create.alert.failure') flash.now.alert = t('verification.letter.create.alert.failure')
render :new render :new
end end
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 private
def letter_params def letter_params
params.require(:letter).permit() params.require(:letter).permit(:verification_code)
end end
def verify_phone_or_email! def verify_phone!
unless current_user.confirmed_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 end
end end

View File

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

View File

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

View File

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

View File

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

View File

@@ -35,14 +35,6 @@ class Debate < ActiveRecord::Base
# Ahoy setup # Ahoy setup
visitable # Ahoy will automatically assign visit_id on create 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 def likes
cached_votes_up cached_votes_up
end end

View File

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

View File

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

View File

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

View File

@@ -1,16 +1,12 @@
class Verification::Letter class Verification::Letter
include ActiveModel::Model include ActiveModel::Model
attr_accessor :user, :address attr_accessor :user, :address, :verification_code
validates :user, presence: true validates :user, presence: true
validates :address, presence: true validates :address, presence: true
validate :correct_address validate :correct_address
def initialize(attrs={})
@user = attrs[:user]
end
def save def save
valid? && valid? &&
letter_requested! && letter_requested! &&
@@ -22,7 +18,11 @@ class Verification::Letter
end end
def letter_requested! 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 end
def update_user_address def update_user_address
@@ -50,4 +50,8 @@ class Verification::Letter
district: address[:nombre_distrito] } district: address[:nombre_distrito] }
end end
def four_digit_code
rand.to_s[2..5]
end
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 class VerifiedUser < ActiveRecord::Base
scope :by_user, -> (user) { where(document_number: user.document_number, scope :by_user, -> (user) { where(document_number: user.document_number,
document_type: user.document_type) } document_type: user.document_type) }

View File

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

View File

@@ -1,17 +1,6 @@
<h2><%= t("admin.comments.index.title") %></h2> <h2><%= t("admin.comments.index.title") %></h2>
<dl class="sub-nav"> <%= render 'shared/filter_subnav', i18n_namespace: "admin.comments.index" %>
<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>
<h3><%= page_entries_info @comments %></h3> <h3><%= page_entries_info @comments %></h3>

View File

@@ -1,17 +1,6 @@
<h2><%= t("admin.debates.index.title") %></h2> <h2><%= t("admin.debates.index.title") %></h2>
<dl class="sub-nav"> <%= render 'shared/filter_subnav', i18n_namespace: "admin.debates.index" %>
<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>
<h3><%= page_entries_info @debates %></h3> <h3><%= page_entries_info @debates %></h3>

View File

@@ -13,18 +13,7 @@
<% end %> <% end %>
<!-- /. Search organizations --> <!-- /. Search organizations -->
<dl class="sub-nav"> <%= render 'shared/filter_subnav', i18n_namespace: "admin.organizations.index" %>
<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>
<h3><%= page_entries_info @organizations %></h3> <h3><%= page_entries_info @organizations %></h3>

View File

@@ -1,17 +1,6 @@
<h2><%= t("admin.users.index.title") %></h2> <h2><%= t("admin.users.index.title") %></h2>
<dl class="sub-nav"> <%= render 'shared/filter_subnav', i18n_namespace: "admin.users.index" %>
<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>
<h3><%= page_entries_info @users %></h3> <h3><%= page_entries_info @users %></h3>

View File

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

View File

@@ -3,30 +3,24 @@
<div class="filters row"> <div class="filters row">
<div class="small-9 column"> <div class="small-9 column">
<div class="inline-block" > <% if @tag_filter %>
<% if @tag_filter %> <div class="inline-block small-8" >
<h2> <h2>
<%= t("debates.index.filter_topic", <%= t("debates.index.filter_topic",
number: @debates.size, count: @debates.size,
topic: @tag_filter) %> topic: @tag_filter) %>
</h2> </h2>
<% else %> </div>
<h2><%= t("debates.index.select_topic") %></h2> <% end %>
<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>
<div class="inline-block right"> <div class="inline-block <%= 'right' if @tag_filter %>">
<h6 class="inline-block"><%= t("debates.index.select_order") %></h6> <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"> <form class="inline-block">
<select class="js-location-changer" name="order-selector"> <select class="js-location-changer" name="order-selector">
<% @valid_orders.each do |order| %> <% @valid_orders.each do |order| %>
@@ -48,7 +42,7 @@
</div> </div>
<div class="small-12 medium-3 column"> <div class="small-12 medium-3 column">
<aside class="sidebar" role="complementary"> <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" %> <%= render "shared/tag_cloud" %>
</aside> </aside>
</div> </div>

View File

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

View File

@@ -9,9 +9,13 @@
<p class="footer-description"> <p class="footer-description">
<%= t("layouts.footer.description", <%= t("layouts.footer.description",
open_source: link_to(t('layouts.footer.open_source'), t('layouts.footer.open_source_url'), target: 'blank'), more_info: link_to(t("layouts.footer.more_info"), t("layouts.footer.more_info_url")),
github_url: link_to(t('layouts.footer.github_url'), t('layouts.footer.github_url'), target: 'blank')).html_safe 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> </p>
</div> </div>
@@ -35,7 +39,9 @@
<div class="subfooter row"> <div class="subfooter row">
<div class="small-12 column"> <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> </div>
</div> </div>

View File

@@ -3,9 +3,9 @@
<div class="row"> <div class="row">
<%= render "shared/locale_switcher" %> <%= render "shared/locale_switcher" %>
<div class="external-links"> <div class="external-links">
<%= link_to t("layouts.header.participation"), root_path, class: "selected" %>&nbsp;| <%= 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" %>&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" %> <%= link_to t("layouts.header.external_link_opendata"), "/opendata", class: ("selected" if current_page?("/opendata")) %>
</div> </div>
</div> </div>
</section> </section>
@@ -38,10 +38,7 @@
<%#= link_to t("layouts.header.initiatives"), "#" %> <%#= link_to t("layouts.header.initiatives"), "#" %>
</div> --> </div> -->
<div class="small-12 medium-2 column end"> <div class="small-12 medium-2 column end">
<%= link_to t("layouts.header.how_it_works"), "/how_it_works" %> <%= link_to t("layouts.header.more_information"), "/more_information" %>
</div>
<div class="small-12 medium-2 column end">
<%= link_to t("layouts.header.help"), "/help" %>
</div> </div>
<div class="small-12 medium-2 column end"> <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" %> <%= 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 "vendor/modernizr" %>
<%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %> <%= csrf_meta_tags %>
<%= favicon_link_tag "favicon.ico" %>
</head> </head>
<body class="admin"> <body class="admin">

View File

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

View File

@@ -1,17 +1,6 @@
<h2><%= t("moderation.comments.index.title") %></h2> <h2><%= t("moderation.comments.index.title") %></h2>
<dl class="sub-nav"> <%= render 'shared/filter_subnav', i18n_namespace: "moderation.comments.index" %>
<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>
<h3><%= page_entries_info @comments %></h3> <h3><%= page_entries_info @comments %></h3>

View File

@@ -1,17 +1,6 @@
<h2><%= t("moderation.debates.index.title") %></h2> <h2><%= t("moderation.debates.index.title") %></h2>
<dl class="sub-nav"> <%= render 'shared/filter_subnav', i18n_namespace: "moderation.debates.index" %>
<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>
<h3><%= page_entries_info @debates %></h3> <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="row">
<div class="small-12 column"> <div class="menu small-12 medium-3 column">
<div class="small-12 medium-3 column menu"> <p><strong>¿Cómo funciona este Portal de Gobierno Abierto?</strong></p>
<h1>¿Cómo funciona esta página?</h1> <ul>
<li>
<a href="#1">¿Cómo funciona esta página?</a> <a href="#">I. Participación</a>
<ul>
<li><a href="#">I.1. Espacio de debate</a></li>
</ul>
</li>
</ul>
</div> </div>
<div class="text small-12 medium-9 column">
<div class="small-12 medium-9 column text"> <h1>¿Cómo funciona este Portal de Gobierno Abierto?</h1>
<h2 id="1">¿Cómo funciona esta página?</h2>
<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>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> <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> <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>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>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>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> </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="row">
<div class="small-12 column"> <div class="text small-12 column">
<h1><%= t('pages.privacy') %></h1> <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> </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="row">
<div class="small-12 column"> <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.email_field :email, placeholder: t("devise_views.users.registrations.new.email_label") %>
<%= f.password_field :password, autocomplete: "off", <%= 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"> <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> <div class="progress small-12 success round">
<%= t('verification.letter.new.explanation') %> <span class="meter" style="width: 100%"></span>
</div>
</div> </div>
<%= form_for @letter, as: "letter", url: letter_path do |f| %> <div class="small-12 medium-12 column">
<%= render 'shared/errors', resource: @letter %>
<%= f.submit t('verification.letter.new.submit_button') %> <h1 class="inline-block"><%= t("verification.letter.new.title") %></h1>
<% end %>
<%= 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> </div>

View File

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

View File

@@ -1,38 +1,64 @@
<div class="row account"> <div class="verification account row">
<div class="small-12 column"> <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| %> <%= form_for @residence, as: "residence", url: residence_path do |f| %>
<%= render 'errors' %> <%= render "errors" %>
<div class="small-12 medium-6"> <div class="small-12 medium-8">
<div class="small-6 medium-3"> <div class="small-12 medium-4 left">
<%= f.select :document_type, document_types, prompt: "" %> <%= f.label t("verification.residence.new.document_type_label") %>
<%= f.select :document_type, document_types, prompt: "", label: false %>
</div> </div>
<div class="small-6 medium-8"> <div class="small-12 medium-5 left">
<%= f.text_field :document_number %> <%= f.label t("verification.residence.new.document_number") %>
<%= f.text_field :document_number, label: false %>
</div> </div>
</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, <%= f.date_select :date_of_birth,
prompt: true, prompt: true,
start_year: 1900, end_year: 16.years.ago.year %> start_year: 1900, end_year: 16.years.ago.year,
label: false %>
</div> </div>
<div class="small-12 medium-4 clear"> <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>
<div class="small-12"> <div class="small-12">
<%= f.check_box :terms_of_service, label: t("verification.residence.new.accept_terms_text") %> <%= f.check_box :terms_of_service, label: false %>
<%= link_to t("verification.residence.new.accept_terms_link"), '/census_terms', target: "_blank" %> <%= 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>
<div class="small-12 clear"> <div class="small-12 clear">
<%= f.submit "Verify" %> <%= f.submit t("verification.residence.new.verify_residence") %>
</div> </div>
<% end %> <% end %>
</div> </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="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| %> <%= form_for @sms, as: "sms", url: sms_path, method: :put do |f| %>
<p><%= @error %></p> <% if @error %>
<%= f.text_field :confirmation_code %> <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 %> <% end %>
<%= t('verification.sms.edit.resend_sms_text') %> <%= t("verification.sms.edit.resend_sms_text") %>
<%= link_to t('verification.sms.edit.resend_sms_link'), verified_user_path %> <%= link_to t("verification.sms.edit.resend_sms_link"), verified_user_path %>
</div> </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="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| %> <%= 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 %> <% end %>
</div> </div>
</div> </div>

View File

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

View File

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

View File

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

View File

@@ -6,4 +6,5 @@ set :ssh_options, port: deploysecret(:ssh_port)
set :stage, :production set :stage, :production
set :rails_env, :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: ignore_unused:
- 'activerecord.*' - 'activerecord.*'
- 'activemodel.*' - 'activemodel.*'
- 'admin.organizations.index.filter.*'
- 'unauthorized.*' - 'unauthorized.*'
- 'simple_captcha.*' - 'simple_captcha.*'
- 'admin.officials.level_*' - '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 - 'helpers.page_entries_info.*' # kaminari
- 'views.pagination.*' # kaminari - 'views.pagination.*' # kaminari
- 'debates.index.orders.*' #order filters for debates
# - '{devise,kaminari,will_paginate}.*' # - '{devise,kaminari,will_paginate}.*'
# - 'simple_form.{yes,no}' # - 'simple_form.{yes,no}'
# - 'simple_form.{placeholders,hints,labels}.*' # - 'simple_form.{placeholders,hints,labels}.*'

View File

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

View File

@@ -53,7 +53,8 @@ es:
back_link: "Atrás" back_link: "Atrás"
new: new:
title: "Registrarse" 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" email_label: "Email"
password_label: "Contraseña" password_label: "Contraseña"
password_confirmation_label: "Confirmar contraseña" password_confirmation_label: "Confirmar contraseña"

View File

@@ -16,10 +16,10 @@ en:
open_city_slogan: open_city_slogan:
"Start listening to Madrid. "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. 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: 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 "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, 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." 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." open_city_soon: "And soon... we opened the section of citizen proposals."
see_all_debates: See all debates see_all_debates: See all debates
@@ -28,25 +28,30 @@ en:
administration: Administration administration: Administration
moderation: Moderation moderation: Moderation
# welcome: Welcome # welcome: Welcome
how_it_works: How it works more_information: "More information"
help: Help
debates: Debates debates: Debates
# initiatives: Initiatives # initiatives: Initiatives
footer: footer:
description: description:
"The city you want, it will be the city you want. Get more information here on this page. "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_url}. This Open Government Portal is %{open_source}, and code is in %{github}.
Madrid, for the whole world." Madrid, for the whole world."
more_info: Get more information
more_info_url: "/more_information"
open_source: "software libre AGPLv3" open_source: "software libre AGPLv3"
open_source_url: "http://www.gnu.org/licenses/agpl-3.0.html" open_source_url: "http://www.gnu.org/licenses/agpl-3.0.html"
github: "github"
github_url: "https://github.com/ayuntamientomadrid" github_url: "https://github.com/ayuntamientomadrid"
copyright: "Ayuntamiento de Madrid, 2015. All rights reserved" copyright: "Ayuntamiento de Madrid, %{year}"
participation_title: "Participation" participation_title: "Participation"
participation_text: Decide what should be the city of Madrid you want. participation_text: Decide what should be the city of Madrid you want.
transparency_title: Transparency transparency_title: Transparency
transparency_text: Get any information on the City of Madrid. transparency_text: Get any information on the City of Madrid.
open_data_title: Open Data 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: form:
error: error error: error
errors: errors errors: errors
@@ -54,21 +59,22 @@ en:
accept_terms: I accept the privacy policy and the legal terms accept_terms: I accept the privacy policy and the legal terms
user: account user: account
debate: debate debate: debate
sms: phone verification::sms: phone
application: application:
alert: alert:
only_beta_testers: "Sorry only Beta Testers are allowed access at the moment" only_beta_testers: "Sorry only Beta Testers are allowed access at the moment"
debates: debates:
index: index:
create_debate: Create a debate start_debate: Start a debate
select_order: Order by select_order: Order by
select_order_long: Order debates by
orders: orders:
created_at: newest created_at: newest
total_votes: most voted total_votes: most voted
likes: best rated likes: best rated
select_topic: "Filter by topic:" filter_topic:
filter_topic: "You are seeing %{number} debates with the topic '%{topic}'" one: "You are seeing one debate with the topic '%{topic}'"
all: All other: "You are seeing %{count} debates with the topic '%{topic}'"
debate: debate:
debate: Debate debate: Debate
comments: comments:
@@ -95,14 +101,13 @@ en:
other: "%{count} votes" other: "%{count} votes"
form: form:
debate_title: Debate title debate_title: Debate title
title_instructions: "SBe clear and precise with the title, but make it informative" debate_text: Initial text for debate
debate_text: Ellaborate your opinion
text_instructions: "Explain your opinion, go into details, tell us what's the purpose of your idea"
tags_label: Topics tags_label: Topics
tags_instructions: > 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". writing them separated by "," and then pressing "enter".
Some suggestions: Some suggestions:
start_debate: Start a debate
show: show:
back_link: Back back_link: Back
author_deleted: Deleted user author_deleted: Deleted user
@@ -119,7 +124,7 @@ en:
show_link: Show debate show_link: Show debate
back_link: Back back_link: Back
new: new:
publish_new: Publish new debate start_new: Start a debate
back_link: Back back_link: Back
recommendations_title: Tips for creating a debate 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." 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" phone_number_label: "Phone number"
organization_name_label: "Organization name" organization_name_label: "Organization name"
notifications: Notifications notifications: Notifications
level_two_user: You are a level 2 user finish_verification: "Finish verification"
level_three_user: You are a level 3 user verified_account: Verified account
verify_my_account: Verify my account verify_my_account: Verify my account
simple_captcha: simple_captcha:
placeholder: "Enter the image value" 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" refresh_button_text: "Refresh"
message: message:
user: "secret code did not match with the image" user: "secret code did not match with the image"

View File

@@ -16,10 +16,10 @@ es:
open_city_slogan: open_city_slogan:
"Empecemos escuchando qué tiene que decir Madrid. "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. 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: 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 "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, 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." 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." open_city_soon: "Y muy pronto... abrimos la sección de propuestas ciudadanas."
see_all_debates: Ver todos los debates see_all_debates: Ver todos los debates
@@ -28,25 +28,30 @@ es:
administration: Administrar administration: Administrar
moderation: Moderar moderation: Moderar
# welcome: Portada # welcome: Portada
how_it_works: "Cómo funciona" more_information: "Más información"
help: Ayuda
debates: Debates debates: Debates
# initiatives: Iniciativas # initiatives: Iniciativas
footer: footer:
description: description:
"La ciudad que quieres, será la ciudad que quieras. Obtén aquí más información sobre esta página. "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_url}. Este Portal de Gobierno Abierto es %{open_source}, y su código se encuentra en %{github}.
De Madrid, para el mundo entero." 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: "software libre AGPLv3"
open_source_url: "http://www.gnu.org/licenses/agpl-3.0.html" open_source_url: "http://www.gnu.org/licenses/agpl-3.0.html"
github: "github"
github_url: "https://github.com/ayuntamientomadrid" 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_title: "Participación"
participation_text: "Decide cómo debe ser la ciudad de Madrid que quieres." participation_text: "Decide cómo debe ser la ciudad de Madrid que quieres."
transparency_title: Transparencia transparency_title: Transparencia
transparency_text: "Obtén cualquier información sobre el Ayuntamiento de Madrid." transparency_text: "Obtén cualquier información sobre el Ayuntamiento de Madrid."
open_data_title: Datos Abiertos 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: form:
error: error error: error
errors: errores errors: errores
@@ -54,21 +59,22 @@ es:
accept_terms: Acepto la política de privacidad y el aviso legal accept_terms: Acepto la política de privacidad y el aviso legal
user: la cuenta user: la cuenta
debate: el debate debate: el debate
sms: el teléfono verification::sms: el teléfono
application: application:
alert: alert:
only_beta_testers: "Lo sentimos sólo los usuarios de pruebas tienen acceso de momento" only_beta_testers: "Lo sentimos sólo los usuarios de pruebas tienen acceso de momento"
debates: debates:
index: index:
create_debate: Crea un debate start_debate: Empieza un debate
select_order: Ordenar por select_order: Ordenar por
select_order_long: Estás viendo los debates
orders: orders:
created_at: "más nuevos" created_at: "más nuevos"
total_votes: "más votados" total_votes: "más votados"
likes: mejor valorados likes: "mejor valorados"
select_topic: "Filtrar por tema:" filter_topic:
filter_topic: "Estás viendo %{number} debates con el tema '%{topic}'" one: "Estás viendo un debate con el tema ''%{topic}''"
all: Todos other: "Estás viendo %{count} debates con el tema '%{topic}'"
debate: debate:
debate: Debate debate: Debate
comments: comments:
@@ -95,14 +101,13 @@ es:
other: "%{count} votos" other: "%{count} votos"
form: form:
debate_title: Título del debate 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: Texto inicial del debate
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"
tags_label: Temas tags_label: Temas
tags_instructions: > 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". Para ello solo tienes que escribir las etiquetas que desees separadas por "," y pulsar "intro".
Algunas recomendaciones: Algunas recomendaciones:
start_debate: Empieza un debate
show: show:
back_link: Volver back_link: Volver
author_deleted: Usuario eliminado author_deleted: Usuario eliminado
@@ -119,7 +124,7 @@ es:
show_link: Ver debate show_link: Ver debate
back_link: Volver back_link: Volver
new: new:
publish_new: Publicar debate nuevo start_new: Empezar un debate
back_link: Volver back_link: Volver
recommendations_title: Recomendaciones para crear un debate 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." 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" phone_number_label: "Teléfono"
organization_name_label: "Nombre de la organización" organization_name_label: "Nombre de la organización"
notifications: Notificaciones notifications: Notificaciones
level_two_user: Eres un usuario verificado de nivel 2 finish_verification: "Finalizar verificación"
level_three_user: Eres un usuario verificado de nivel 3 verified_account: Cuenta verificada
verify_my_account: Verificar mi cuenta verify_my_account: Verificar mi cuenta
simple_captcha: simple_captcha:
placeholder: "Introduce el texto de la imagen" 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" refresh_button_text: "Refrescar"
message: message:
user: "el código secreto no coincide con la imagen" user: "el código secreto no coincide con la imagen"

View File

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

View File

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

View File

@@ -1,49 +1,59 @@
en: en:
verification: verification:
step_1: "1. Residence"
step_2: "2. Confirmation code"
step_3: "3. Final verification"
residence: residence:
new: new:
title: 'Verify residence' title: "Verify residence"
document_type_label: "Document type"
document_type: document_type:
spanish_id: 'Spanish ID' spanish_id: "Spanish ID"
passport: 'Passport' passport: "Passport"
residence_card: 'Residence card' residence_card: "Residence card"
accept_terms_text: "I accept the terms to access the city Census" document_number: "Document number"
accept_terms_link: "Read terms" date_of_birth: "Date of birth"
form_errors: 'prevented your residence verification' postal_code: "Postal code"
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.' 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: create:
flash: flash:
success: 'Residence verified' success: "Residence verified"
alert: alert:
verify_attemps_left: 'You have reached the maximum number of Census verification tries' verify_attemps_left: "You have reached the maximum number of Census verification tries"
unconfirmed_residency: 'You have not yet confirmed your residence' unconfirmed_residency: "You have not yet confirmed your residence"
sms: sms:
new: new:
title: Phone verification title: "Phone verification"
submit_button: Send phone: "Enter your phone for recive the code"
submit_button: "Send"
create: create:
flash: flash:
success: 'Enter the confirmation code we have sent your phone' success: "Enter the confirmation code we have sent your phone"
edit: edit:
title: Security code confirmation title: "Security code confirmation"
resend_sms_text: You have not received the confirmation code in your phone? confirmation_code: "Code confirmation"
resend_sms_link: Click here to send the confirmation code again resend_sms_text: "You have not received the confirmation code in your phone?"
submit_button: Send resend_sms_link: "Click here to send the confirmation code again"
submit_button: "Send"
update: update:
error: 'Incorrect confirmation code' error: "Incorrect confirmation code"
flash: flash:
level_three: level_three:
success: 'Correct code. You are now a verified user' success: "Correct code. Your account is verified"
level_two: level_two:
success: 'Correct code' success: "Correct code"
alert: 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: email:
show: show:
flash: flash:
success: 'You are now a verified user' success: "You are now a verified user"
alert: alert:
failure: 'Incorrect verification code' failure: "Incorrect verification code"
create: create:
flash: flash:
success: "We have send you a confirmation email to your email account: %{email}" 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" failure: "There was a problem sending you an email to your account"
letter: letter:
new: new:
title: Final Verification 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' explanation_html:
submit_button: 'Send me a letter' "<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: create:
flash: 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: alert:
failure: "We could not verify your address with the Census please try again later" 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: alert:
unconfirmed_personal_data: 'You have not yet confirmed your personal data' unconfirmed_code: "You have not yet enter the confirmation code"
verified_user: verified_user:
show: show:
title: Available information title: "Available information"
email_title: Emails explanation: "We currently have the following data in the Census, choose where you want to send the confirmation code."
phone_title: Phones email_title: "Emails"
use_another_phone: Use another phone phone_title: "Phones"
use_another_phone: "Use another phone"
form: form:
submit_button: Send submit_button: "Send code"

View File

@@ -1,49 +1,59 @@
es: es:
verification: verification:
step_1: "1. Residencia"
step_2: "2. Código de confirmación"
step_3: "3. Verificación final"
residence: residence:
new: new:
title: 'Verificar residencia' title: "Verificar residencia"
document_type_label: "Tipo de documento"
document_type: document_type:
spanish_id: 'DNI' spanish_id: "DNI"
passport: 'Pasaporte' passport: "Pasaporte"
residence_card: 'Tarjeta de residencia' residence_card: "Tarjeta de residencia"
accept_terms_text: "Acepto los terminos de acceso al Padrón" document_number: "Número de documento"
accept_terms_link: "Leer términos" date_of_birth: "Fecha de nacimiento"
form_errors: 'evitaron verificar tu residencia' postal_code: "Código postal"
error_verifying_census: 'El Padrón de Madrid no pudo verificar tu información. Revisa la información ó ponte en contacto con nosotros.' 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: create:
flash: flash:
success: 'Residencia verificada' success: "Residencia verificada"
alert: alert:
verify_attemps_left: 'Has llegado al máximo número de intentos de verificar 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' unconfirmed_residency: "Aún no has verificado tu residencia"
sms: sms:
new: new:
title: Verificación de teléfono móvil title: "Recibir código de confirmación"
submit_button: Enviar phone: "Introduce tu teléfono móvil para recibir el código"
submit_button: "Enviar"
create: create:
flash: 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: edit:
title: 'Confirmación de código de seguridad' 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?' confirmation_code: "Introduce el código que has recibido en tu móvil"
resend_sms_link: 'Haz click aquí para volver a enviártelo' resend_sms_text: "¿No has recibido un mensaje de texto con tu código de confirmación?"
submit_button: Enviar resend_sms_link: "Haz click aquí para volver a enviártelo"
submit_button: "Enviar"
update: update:
error: 'Código de confirmación incorrecto' error: "Código de confirmación incorrecto"
flash: flash:
level_three: level_three:
success: 'Código correcto. Ya eres un usuario verificado' success: "Código correcto. Tu cuenta ya está verificada"
level_two: level_two:
success: 'Código incorrecto' success: "Código correcto"
alert: 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: email:
show: show:
flash: flash:
success: 'Eres un usuario verificado' success: "Eres un usuario verificado"
alert: alert:
failure: 'Código de verificación incorrecto' failure: "Código de verificación incorrecto"
create: create:
flash: flash:
success: "Te hemos enviado un email de confirmación a tu cuenta: %{email}" 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" failure: "Hubo un problema enviándote un email a tu cuenta"
letter: letter:
new: new:
title: Final Verification title: "Verificación Final"
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' explanation_html:
submit_button: 'Send me a letter' "<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: create:
flash: 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: 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: 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: verified_user:
show: show:
title: Información disponible title: "Información disponible"
email_title: Emails explanation: "Actualmente disponemos de los siguientes datos en el Padrón, selecciona donde quieres que enviemos el código de confirmación."
phone_title: Teléfonos email_title: "Emails"
use_another_phone: Utilizar otro teléfono phone_title: "Teléfonos"
use_another_phone: "Utilizar otro teléfono"
form: 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 :sms, controller: "sms", only: [:new, :create, :edit, :update]
resource :verified_user, controller: "verified_user", only: [:show] resource :verified_user, controller: "verified_user", only: [:show]
resource :email, controller: "email", only: [:new, :show, :create] 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 end
namespace :admin do 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 "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.datetime "hidden_at" t.datetime "hidden_at"
t.integer "children_count", default: 0
t.integer "flags_count", default: 0 t.integer "flags_count", default: 0
t.datetime "ignored_flag_at" t.datetime "ignored_flag_at"
t.integer "moderator_id" t.integer "moderator_id"
@@ -90,8 +91,8 @@ ActiveRecord::Schema.define(version: 20150903142924) do
t.integer "author_id" t.integer "author_id"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.datetime "hidden_at"
t.string "visit_id" t.string "visit_id"
t.datetime "hidden_at"
t.integer "flags_count", default: 0 t.integer "flags_count", default: 0
t.datetime "ignored_flag_at" t.datetime "ignored_flag_at"
t.integer "cached_votes_total", default: 0 t.integer "cached_votes_total", default: 0
@@ -198,13 +199,12 @@ ActiveRecord::Schema.define(version: 20150903142924) do
t.string "unconfirmed_email" t.string "unconfirmed_email"
t.boolean "email_on_debate_comment", default: false t.boolean "email_on_debate_comment", default: false
t.boolean "email_on_comment_reply", default: false t.boolean "email_on_comment_reply", default: false
t.string "phone_number", limit: 30
t.string "official_position" t.string "official_position"
t.integer "official_level", default: 0 t.integer "official_level", default: 0
t.datetime "hidden_at" 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 "sms_confirmation_code"
t.string "username"
t.string "document_number" t.string "document_number"
t.string "document_type" t.string "document_type"
t.datetime "residence_verified_at" t.datetime "residence_verified_at"
@@ -216,6 +216,8 @@ ActiveRecord::Schema.define(version: 20150903142924) do
t.string "unconfirmed_phone" t.string "unconfirmed_phone"
t.string "confirmed_phone" t.string "confirmed_phone"
t.datetime "letter_requested_at" t.datetime "letter_requested_at"
t.datetime "confirmed_hide_at"
t.string "letter_verification_code"
end end
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree 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 # Names for the moderation console, as a hint for moderators
# to know better how to assign users with official positions # to know better how to assign users with official positions
Setting.create(key: 'official_level_1_name', value: 'Empleados públicos') 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') Setting.create(key: 'official_level_5_name', value: 'Alcaldesa')
# Max percentage of allowed anonymous votes on a debate # 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 class ApplicationResponder < ActionController::Responder
include Responders::FlashResponder include Responders::FlashResponder
include Responders::HttpCacheResponder 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 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 expect(response).to be_ok
end end
it 'should include a legal page' do it 'should include a conditions page' do
get :legal get :conditions
expect(response).to be_ok expect(response).to be_ok
end end

View File

@@ -29,7 +29,7 @@ feature 'Admin officials' do
expect(page).to have_content @official.email expect(page).to have_content @official.email
fill_in 'user_official_position', with: 'School Teacher' 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' click_button 'Update User'
expect(page).to have_content 'Official position saved!' expect(page).to have_content 'Official position saved!'
@@ -52,7 +52,7 @@ feature 'Admin officials' do
click_link @citizen.name click_link @citizen.name
fill_in 'user_official_position', with: 'Hospital manager' 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' click_button 'Update User'
expect(page).to have_content 'Official position saved!' 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 @citizen.name
expect(page).to_not have_content @official.name expect(page).to_not have_content @official.name
end end
end end

View File

@@ -31,7 +31,7 @@ feature 'Comments' do
expect(page).to have_content("1") expect(page).to have_content("1")
expect(page).to have_content("2") expect(page).to have_content("2")
expect(page).to_not have_content("3") expect(page).to_not have_content("3")
click_link "Next" click_link "Next", exact: false
end end
expect(page).to have_css('.comment', count: 2) 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("1")
expect(page).to have_content("2") expect(page).to have_content("2")
expect(page).to_not have_content("3") expect(page).to_not have_content("3")
click_link "Next" click_link "Next", exact: false
end end
expect(page).to have_selector('#debates .debate', count: 2) expect(page).to have_selector('#debates .debate', count: 2)
@@ -60,7 +60,7 @@ feature 'Debates' do
fill_in 'debate_captcha', with: correct_captcha_text fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service' 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 'Debate was successfully created.'
expect(page).to have_content 'Acabar con los desahucios' expect(page).to have_content 'Acabar con los desahucios'
@@ -78,13 +78,13 @@ feature 'Debates' do
fill_in 'debate_captcha', with: "wrongText!" fill_in 'debate_captcha', with: "wrongText!"
check 'debate_terms_of_service' 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_not have_content "Debate was successfully created."
expect(page).to have_content "1 error" expect(page).to have_content "1 error"
fill_in 'debate_captcha', with: correct_captcha_text 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." expect(page).to have_content "Debate was successfully created."
end end
@@ -100,7 +100,7 @@ feature 'Debates' do
fill_in 'debate_captcha', with: correct_captcha_text fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service' 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_not have_content "Debate was successfully created."
expect(page).to have_content "1 error" expect(page).to have_content "1 error"
@@ -115,7 +115,7 @@ feature 'Debates' do
login_as(author) login_as(author)
visit new_debate_path visit new_debate_path
click_button 'Create Debate' click_button 'Start a debate'
expect(page).to have_content error_message expect(page).to have_content error_message
end end
@@ -129,7 +129,7 @@ feature 'Debates' do
fill_in 'debate_captcha', with: correct_captcha_text fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service' 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 'Debate was successfully created.'
expect(page).to have_content 'A test' expect(page).to have_content 'A test'
@@ -161,7 +161,7 @@ feature 'Debates' do
find('.js-add-tag-link', text: tag_name).click find('.js-add-tag-link', text: tag_name).click
end end
click_button 'Create Debate' click_button 'Start a debate'
expect(page).to have_content 'Debate was successfully created.' expect(page).to have_content 'Debate was successfully created.'
['Medio Ambiente', 'Ciencia'].each do |tag_name| ['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>' 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 'Debate was successfully created.'
expect(page).to have_content 'user_id1' expect(page).to have_content 'user_id1'
@@ -222,7 +222,7 @@ feature 'Debates' do
fill_in 'debate_description', with: "Let's..." fill_in 'debate_description', with: "Let's..."
fill_in 'debate_captcha', with: correct_captcha_text 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 "Debate was successfully updated."
expect(page).to have_content "End child poverty" expect(page).to have_content "End child poverty"
@@ -235,7 +235,7 @@ feature 'Debates' do
visit edit_debate_path(debate) visit edit_debate_path(debate)
fill_in 'debate_title', with: "" fill_in 'debate_title', with: ""
click_button 'Update Debate' click_button 'Start a debate'
expect(page).to have_content error_message expect(page).to have_content error_message
end end
@@ -249,13 +249,13 @@ feature 'Debates' do
fill_in 'debate_title', with: "New title" fill_in 'debate_title', with: "New title"
fill_in 'debate_captcha', with: "wrong!" 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_not have_content "Debate was successfully updated."
expect(page).to have_content "1 error" expect(page).to have_content "1 error"
fill_in 'debate_captcha', with: correct_captcha_text 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 "Debate was successfully updated."
end end
@@ -271,7 +271,7 @@ feature 'Debates' do
fill_in 'debate_title', with: "" fill_in 'debate_title', with: ""
fill_in 'debate_captcha', with: correct_captcha_text 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_not have_content "Debate was successfully updated."
expect(page).to have_content "1 error" 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) expect(@most_liked_debate.title).to appear_before(@most_voted_debate.title)
end end
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 end

View File

@@ -32,7 +32,7 @@ feature 'Organizations' do
scenario 'Shared links' do scenario 'Shared links' do
visit new_user_registration_path 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 visit new_organization_registration_path
expect(page).to have_link "Sign up" 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" 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 'Debate was successfully created.'
expect(page).to have_content 'Economía' 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_tag_list', with: "Economía, Hacienda"
fill_in 'debate_captcha', with: correct_captcha_text 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 'Debate was successfully updated.'
within('.tags') do within('.tags') do
@@ -107,7 +107,7 @@ feature 'Tags' do
fill_in 'debate_tag_list', with: "" fill_in 'debate_tag_list', with: ""
fill_in 'debate_captcha', with: correct_captcha_text 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 'Debate was successfully updated.'
expect(page).to_not have_content 'Economía' 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 within("#verified_user_#{verified_user.id}_email") do
expect(page).to have_content 'roc*@example.com' expect(page).to have_content 'roc*@example.com'
click_button "Send" click_button "Send code"
end end
expect(page).to have_content 'We have send you a confirmation email to your email account: rock@example.com' 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 have_content "You are now a verified user"
expect(page).to_not have_link "Verify my account" 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 end
scenario "Errors on token verification" do scenario "Errors on token verification" do
@@ -58,7 +58,7 @@ feature 'Verify email' do
visit verified_user_path visit verified_user_path
verified_user.destroy 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" expect(page).to have_content "There was a problem sending you an email to your account"
end end

View File

@@ -2,15 +2,45 @@ require 'rails_helper'
feature 'Verify Letter' do 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") user = create(:user, residence_verified_at: Time.now, confirmed_phone: "611111111")
login_as(user) login_as(user)
visit new_letter_path 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 end
scenario "Error accessing address from CensusApi" do 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) 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" expect(page).to have_content "We could not verify your address with the Census please try again later"
end 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 scenario "Deny access unless verified residence" do
user = create(:user) user = create(:user)
@@ -53,7 +72,7 @@ feature 'Verify Letter' do
login_as(user) login_as(user)
visit new_letter_path 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) expect(URI.parse(current_url).path).to eq(new_sms_path)
end end

View File

@@ -17,7 +17,7 @@ feature 'Level three verification' do
verify_residence verify_residence
within("#verified_user_#{verified_user.id}_phone") do within("#verified_user_#{verified_user.id}_phone") do
click_button "Send" click_button "Send code"
end end
expect(page).to have_content 'Security code confirmation' 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 fill_in 'sms_confirmation_code', with: user.sms_confirmation_code
click_button 'Send' click_button 'Send'
expect(page).to have_content 'Correct code' expect(page).to have_content "Correct code. Your account is verified"
expect(page).to have_content "You are now a verified user"
expect(page).to_not have_link "Verify my account" 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 end
scenario 'Verification with residency and verified email' do scenario 'Verification with residency and verified email' do
@@ -50,7 +48,7 @@ feature 'Level three verification' do
verify_residence verify_residence
within("#verified_user_#{verified_user.id}_email") do within("#verified_user_#{verified_user.id}_email") do
click_button "Send" click_button "Send code"
end end
expect(page).to have_content 'We have send you a confirmation email to your email account: rock@example.com' 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 have_content "You are now a verified user"
expect(page).to_not have_link "Verify my account" 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 end
scenario 'Verification with residency and sms and letter' do 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' 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
end end

View File

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

View File

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

View File

@@ -174,21 +174,6 @@ describe Debate do
end end
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 describe '#default_order' do
let!(:economy) { create(:debate) } let!(:economy) { create(:debate) }
let!(:health) { create(:debate) } let!(:health) { create(:debate) }

View File

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

View File

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