diff --git a/Gemfile b/Gemfile
index be0f9309f..361440368 100644
--- a/Gemfile
+++ b/Gemfile
@@ -48,22 +48,23 @@ group :development do
gem 'airbrussh', require: false
gem 'localeapp', '2.1.1', require: false
gem 'letter_opener', '1.4.1'
- gem 'dotenv-rails', '2.5.0'
+ gem 'dotenv-rails', '~> 2.7.1'
end
group :development, :test do
- gem "rspec-rails", '~> 3.7.2'
gem "byebug"
end
group :test do
+ gem "rspec-rails", '~> 3.8.2'
gem "database_cleaner", '1.6.2'
gem 'shoulda-matchers', '~> 3.1.2'
gem 'fabrication'
- gem 'faker'
- gem 'capybara', '~> 2.7'
- gem 'capybara-selenium', '~> 0.0.6'
- gem 'chromedriver-helper', '~> 1.0'
+ gem 'faker', '~> 1.9'
+ gem 'capybara', '~> 3.13'
+ gem 'selenium-webdriver', '~> 3.141'
+ gem 'chromedriver-helper', '~> 2.1'
+ gem 'simplecov', '~> 0.16.1', require: false
end
group :production do
diff --git a/Gemfile.lock b/Gemfile.lock
index bb95fa0ac..20335b45e 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -86,19 +86,17 @@ GEM
capistrano-rbenv (2.1.3)
capistrano (~> 3.1)
sshkit (~> 1.3)
- capybara (2.18.0)
+ capybara (3.13.2)
addressable
mini_mime (>= 0.1.3)
- nokogiri (>= 1.3.3)
- rack (>= 1.0.0)
- rack-test (>= 0.5.4)
- xpath (>= 2.0, < 4.0)
- capybara-selenium (0.0.6)
- capybara
- selenium-webdriver
+ nokogiri (~> 1.8)
+ rack (>= 1.6.0)
+ rack-test (>= 0.6.3)
+ regexp_parser (~> 1.2)
+ xpath (~> 3.2)
childprocess (0.9.0)
ffi (~> 1.0, >= 1.0.11)
- chromedriver-helper (1.2.0)
+ chromedriver-helper (2.1.0)
archive-zip (~> 0.10)
nokogiri (~> 1.8)
chronic (0.10.2)
@@ -124,12 +122,13 @@ GEM
responders
warden (~> 1.2.3)
diff-lcs (1.3)
+ docile (1.3.1)
domain_name (0.5.20170223)
unf (>= 0.0.5, < 1.0.0)
- dotenv (2.5.0)
- dotenv-rails (2.5.0)
- dotenv (= 2.5.0)
- railties (>= 3.2, < 6.0)
+ dotenv (2.7.1)
+ dotenv-rails (2.7.1)
+ dotenv (= 2.7.1)
+ railties (>= 3.2, < 6.1)
elasticsearch (1.0.8)
elasticsearch-api (= 1.0.7)
elasticsearch-transport (= 1.0.7)
@@ -149,11 +148,11 @@ GEM
tzinfo
execjs (2.6.0)
fabrication (2.11.3)
- faker (1.4.3)
- i18n (~> 0.5)
+ faker (1.9.3)
+ i18n (>= 0.7)
faraday (0.9.1)
multipart-post (>= 1.2, < 3)
- ffi (1.9.25)
+ ffi (1.10.0)
formtastic (3.1.5)
actionpack (>= 3.2.13)
formtastic_i18n (0.6.0)
@@ -288,6 +287,7 @@ GEM
polyamorous (~> 1.3.2)
rdiscount (2.1.7.1)
redis (4.0.1)
+ regexp_parser (1.3.0)
responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
@@ -297,23 +297,23 @@ GEM
netrc (~> 0.8)
rollbar (2.8.3)
multi_json
- rspec-core (3.7.1)
- rspec-support (~> 3.7.0)
- rspec-expectations (3.7.0)
+ rspec-core (3.8.0)
+ rspec-support (~> 3.8.0)
+ rspec-expectations (3.8.2)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.7.0)
- rspec-mocks (3.7.0)
+ rspec-support (~> 3.8.0)
+ rspec-mocks (3.8.0)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.7.0)
- rspec-rails (3.7.2)
+ rspec-support (~> 3.8.0)
+ rspec-rails (3.8.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
- rspec-core (~> 3.7.0)
- rspec-expectations (~> 3.7.0)
- rspec-mocks (~> 3.7.0)
- rspec-support (~> 3.7.0)
- rspec-support (3.7.0)
+ rspec-core (~> 3.8.0)
+ rspec-expectations (~> 3.8.0)
+ rspec-mocks (~> 3.8.0)
+ rspec-support (~> 3.8.0)
+ rspec-support (3.8.0)
rubocop (0.52.1)
parallel (~> 1.10)
parser (>= 2.4.0.2, < 3.0)
@@ -334,9 +334,9 @@ GEM
tilt (>= 1.1, < 3)
select2-rails (4.0.1)
thor (~> 0.14)
- selenium-webdriver (3.11.0)
+ selenium-webdriver (3.141.0)
childprocess (~> 0.5)
- rubyzip (~> 1.2)
+ rubyzip (~> 1.2, >= 1.2.2)
shoulda-matchers (3.1.2)
activesupport (>= 4.0.0)
sidekiq (5.1.3)
@@ -350,6 +350,11 @@ GEM
simple_form (3.1.0)
actionpack (~> 4.0)
activemodel (~> 4.0)
+ simplecov (0.16.1)
+ docile (~> 1.1)
+ json (>= 1.8, < 3)
+ simplecov-html (~> 0.10.0)
+ simplecov-html (0.10.2)
skylight (2.0.1)
skylight-core (= 2.0.1)
skylight-core (2.0.1)
@@ -390,7 +395,7 @@ GEM
sprockets-rails (>= 2.0, < 4.0)
whenever (0.9.4)
chronic (>= 0.6.3)
- xpath (3.0.0)
+ xpath (3.2.0)
nokogiri (~> 1.8)
PLATFORMS
@@ -406,18 +411,17 @@ DEPENDENCIES
capistrano (~> 3.1)
capistrano-rails (~> 1.1)
capistrano-rbenv (~> 2.1)
- capybara (~> 2.7)
- capybara-selenium (~> 0.0.6)
- chromedriver-helper (~> 1.0)
+ capybara (~> 3.13)
+ chromedriver-helper (~> 2.1)
coffee-rails
dalli
database_cleaner (= 1.6.2)
devise (~> 4.5.0)
- dotenv-rails (= 2.5.0)
+ dotenv-rails (~> 2.7.1)
elasticsearch-model
elasticsearch-rails
fabrication
- faker
+ faker (~> 1.9)
has_scope
hstore_translate
http_accept_language (~> 2.1.1)
@@ -434,15 +438,17 @@ DEPENDENCIES
rails_12factor (= 0.0.3)
rdiscount
rollbar (= 2.8.3)
- rspec-rails (~> 3.7.2)
+ rspec-rails (~> 3.8.2)
rubocop (~> 0.52.1)
rufus-scheduler (~> 3.4.2)
sass-rails (~> 5.0.7)
select2-rails
+ selenium-webdriver (~> 3.141)
shoulda-matchers (~> 3.1.2)
sidekiq (= 5.1.3)
sidekiq-cron (= 0.6.3)
simple_form (>= 3.0.0)
+ simplecov (~> 0.16.1)
skylight
uglifier (= 2.7.2)
unicorn
diff --git a/app/assets/images/redeira.png b/app/assets/images/redeira.png
new file mode 100644
index 000000000..1806f0428
Binary files /dev/null and b/app/assets/images/redeira.png differ
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index d9ba1e933..a86f2f506 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -10,7 +10,6 @@ class ApplicationController < ActionController::Base
before_filter :configure_permitted_parameters, if: :devise_controller?
before_filter :set_locale
before_filter :set_current_organization
- after_filter :store_location
rescue_from MissingTOSAcceptance, OutadedTOSAcceptance do
redirect_to terms_path
@@ -21,7 +20,11 @@ class ApplicationController < ActionController::Base
helper_method :current_organization, :admin?, :superadmin?
- protected
+ def switch_lang
+ redirect_to :back
+ end
+
+ private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
@@ -35,17 +38,6 @@ def set_current_organization
end
end
- def store_location
- # store last url - this is needed for post-login redirect to whatever the
- # user last visited.
- return unless request.get?
- paths = ["/", "/users/sign_in", "/users/sign_up", "/users/password/new",
- "/users/password/edit", "/users/confirmation", "/users/sign_out"]
- if !paths.include?(request.path) && !request.xhr?
- session[:previous_url] = request.fullpath
- end
- end
-
def after_sign_in_path_for(user)
if user.members.present?
users_path
@@ -54,8 +46,6 @@ def after_sign_in_path_for(user)
end
end
- private
-
def check_for_terms_acceptance!
if user_signed_in?
accepted = current_user.terms_accepted_at
diff --git a/app/controllers/global_controller.rb b/app/controllers/global_controller.rb
deleted file mode 100644
index 386ce1a48..000000000
--- a/app/controllers/global_controller.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class GlobalController < ApplicationController
- def switch_lang
- redirect_to :back
- end
-end
diff --git a/app/helpers/brand_logo_helper.rb b/app/helpers/brand_logo_helper.rb
new file mode 100644
index 000000000..bc02bb1eb
--- /dev/null
+++ b/app/helpers/brand_logo_helper.rb
@@ -0,0 +1,17 @@
+module BrandLogoHelper
+ def render_brand_logo
+ return unless should_render_logo?
+ render 'application/brand_logo'
+ end
+
+ private
+
+ def should_render_logo?
+ return false unless current_user
+ current_organization&.id == branded_organization_id
+ end
+
+ def branded_organization_id
+ Rails.application.config.branded_organization_id
+ end
+end
diff --git a/app/views/application/_brand_logo.html.erb b/app/views/application/_brand_logo.html.erb
new file mode 100644
index 000000000..4959dfd88
--- /dev/null
+++ b/app/views/application/_brand_logo.html.erb
@@ -0,0 +1,3 @@
+
+ <%= image_tag("redeira.png", class: 'organization-brand-logo img-responsive center-block') %>
+
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 333227399..08ae6962d 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -26,6 +26,7 @@
+ <%= render_brand_logo %>
<%= render 'application/footer' %>
diff --git a/config/application.rb b/config/application.rb
index 2b988b5f7..4bba4fc1b 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -20,7 +20,7 @@ class Application < Rails::Application
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
config.i18n.default_locale = :es
- config.i18n.available_locales = [:es, :ca, :eu, :en, :'pt-BR']
+ config.i18n.available_locales = [:es, :ca, :eu, :gl, :en, :'pt-BR']
config.i18n.fallbacks = true
# Do not swallow errors in after_commit/after_rollback callbacks.
diff --git a/config/initializers/branded_organization.rb b/config/initializers/branded_organization.rb
new file mode 100644
index 000000000..17bbac2b0
--- /dev/null
+++ b/config/initializers/branded_organization.rb
@@ -0,0 +1,7 @@
+DEFAULT_BRANDED_ORG_ID = 246
+
+Rails.application.config.branded_organization_id = nil
+
+unless Rails.env.test?
+ Rails.application.config.branded_organization_id = (Redis.current.get('branded_organization_id') || DEFAULT_BRANDED_ORG_ID).to_i
+end
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
new file mode 100644
index 000000000..740e70946
--- /dev/null
+++ b/config/locales/gl.yml
@@ -0,0 +1,557 @@
+gl:
+ active_admin:
+ comments:
+ author_type: Tipo de autor/a
+ resource_type: Tipo de recurso
+ users:
+ organization: Banco de tempo
+ upload_csv: Ficheiro
+ upload_from_csv: Importar CSV
+ activerecord:
+ attributes:
+ account:
+ balance: Balance
+ organization: Organización
+ category:
+ created_at: Creado
+ name: Nome
+ name_translations: Nome (traducións)
+ parent: Categoría pai
+ updated_at: Actualizado
+ common:
+ created_at: Creado
+ updated_at: Actualizado
+ organization:
+ address: Dirección
+ city: Cidade
+ created_at: Creado
+ description: Descrición
+ email: Correo
+ name: Nome
+ neighborhood: Barrio
+ phone: Teléfono
+ public_opening_times: Horario de atención ao público
+ reg_number_seq: Número de secuencia de persoa usuaria
+ theme: Tema visual
+ updated_at: Actualizado
+ post:
+ category: Categoría
+ created_at: Creado
+ description: Descrición
+ end_on: Termina en
+ joinable: Poden unirse outros
+ permanent: Permanente
+ start_on: Comezar
+ tag_list: Etiquetas
+ title: Título
+ updated_at: Actualizado
+ transfer:
+ amount: Cantidade
+ created_at: Creado
+ hours: Horas
+ minutes: Minutos
+ post: Enviar
+ reason: Comentarios
+ source: Fonte
+ updated_at: Actualizacións
+ user:
+ admin: 'Persoa administradora da organización '
+ alt_phone: Teléfono alternativo
+ created_at: Creado
+ date_of_birth: Data de nacemento
+ description: Descrición
+ email: Correo electrónico
+ gender: Xénero
+ identity_document: Documento de identidade
+ last_sign_in_at: Último inicio de sesión
+ notifications: Recibir notificacións por correo electrónico
+ organization: Organización
+ phone: Teléfono
+ push_notifications: Recibir notificacións móbiles
+ registration_date: Data de rexistro
+ registration_number: Código de persoa usuaria
+ superadmin: Persoa dministradora do sistema
+ unconfirmed_email: Correo electrónico non confirmado
+ updated_at: Actualizado
+ username: Nome
+ errors:
+ models:
+ organization:
+ attributes:
+ web:
+ url_format_invalid: Formato de URL non válido
+ transfer:
+ attributes:
+ base:
+ same_account: Non se pode realizar unha transferencia á mesma conta
+ user:
+ attributes:
+ email:
+ invalid: Non válido
+ models:
+ category:
+ one: Categoría
+ other: Categorías
+ comment:
+ one: Comentario
+ other: Comentarios
+ inquiry:
+ one: Enquisa
+ other: Enquisas
+ offer:
+ one: Oferta
+ other: Ofertas
+ organization:
+ one: Banco de Tempo
+ other: Bancos de Tempo
+ post:
+ one: Publicación
+ other: Publicacións
+ transfer:
+ one: Transferencia
+ other: Transferencias
+ user:
+ one: Persoa usuaria
+ other: Persoas usuarias
+ application:
+ landing:
+ button: Entrar
+ slogan: Permite valorar o noso tempo
+ sub_slogan: Hai un banco de tempo preto de ti
+ login_form:
+ button: Entrar
+ email: 'Correo electrónico '
+ password: Contrasinal
+ remember_check: Lémbrame
+ menu:
+ sign_in: Acceder
+ sing_out: Saír
+ menus:
+ offers_by_tag_link:
+ tags: Etiquetas
+ navbar:
+ admin: Xestionar
+ administration: Administración
+ adminshort: Persona administradora
+ categories: Servizos
+ demographics: Datos demográficos
+ global_activity: Actividade global
+ inactive_users: Persoas suarias inactivas
+ inquiry_public_link: Consultas de enlace público
+ last_login: Último inicio de sesión
+ offer_public_link: Ofrece unha conexión pública
+ organizations: Organizacións
+ reports: Informes
+ sign_out: Saír
+ statistics: Estatísticas
+ statistics_all_transfers: Todas as transferencias
+ stats: Estatísticas
+ tags: Etiquetas
+ type_of_swaps: Tipo de transaccións
+ users: Persoas usuarias
+ without_offers: Sen ofertas
+ organization_list:
+ address: Enderezo
+ city: Cidade
+ description: Descrición
+ email: Correo electrónico
+ neighborhood: Barrio
+ not_member: Neste momento non pertence a ningún banco de tempo, para poder utilizar esta plataforma debes estar en contacto cun dos bancos que teñen a plataforma
+ phone: Teléfono
+ public_opening_times: Horario de funcionamento
+ time_bank: Banco de tempo
+ welcome: Benvidos/as a Timeoverflow %{user}.
+ terms_conditions: Condicións de servizo
+ tips:
+ entertag: Insira etiquetas separadas por comas
+ user_not_found: Persoa suaria non atopada
+ categories:
+ index:
+ add: Engadir servizo
+ all: Todo
+ global: Global
+ local: Local
+ tree: Principal
+ devise:
+ confirmations:
+ confirmed: A túa conta confirmouse con éxito.
+ confirmed_and_signed_in: A túa conta confirmouse con éxito. Agora iniciaches sesión.
+ new:
+ resend_instructions: Reenvía as instrucións de confirmación
+ resend_instructions_button: Reenviar
+ resend_instructions_description: Se cambiou o teu correo electrónico, debes realizar este paso para que o cambio sexa efectivo
+ send_instructions: Recibirás un correo electrónico con instrucións sobre como confirmar a túa conta en poucos minutos.
+ send_paranoid_instructions: Se o enderezo de correo electrónico existe na nosa base de datos, recibirás un correo electrónico con instrucións sobre como confirmar a túa conta en poucos minutos.
+ failure:
+ already_authenticated: Xa estás conectado/a.
+ inactive: A túa conta aínda non está activada.
+ invalid: Correo ou contrasinal non válidos.
+ invalid_token: Token de autenticación non válido.
+ locked: A túa conta está bloqueada.
+ not_found_in_database: Correo ou contrasinal non válidos.
+ timeout: A túa sesión caducou. Inicia sesión de novo para continuar.
+ unauthenticated: Necesitas iniciar sesión ou rexistrarte antes de continuar.
+ unconfirmed: Tes que confirmar a túa conta antes de continuar.
+ user:
+ last_attempt: Atención, tes un intento antes de que a túa conta estea bloqueada
+ mailer:
+ confirmation_instructions:
+ subject: Instrucións de confirmación
+ reset_password_instructions:
+ subject: Restablecer as instrucións do contrasinal
+ unlock_instructions:
+ subject: Instrucións de desbloqueo
+ omniauth_callbacks:
+ failure: Non puiden autenticarte de %{kind} porque "%{reason}".
+ success: Autenticado/a con éxito a partir da conta de %{kind}.
+ passwords:
+ edit:
+ change_password: Cambiar o meu contrasinal
+ confirm_password: Confirma o teu novo contrasinal
+ new_password: Novo contrasinal
+ passwords_not_match: Os contrasinais non coinciden
+ new:
+ forgot_question: Crea un novo contrasinal
+ forgot_question_description: Introduce o enderezo asociado coa túa conta e enviarémosche un correo electrónico coa ligazón para crear un novo contrasinal.
+ send_instructions: Enviar enlace
+ no_token: Non podes acceder a esta páxina sen proceder dun correo electrónico de restablecemento de contrasinal. Se provés dun correo electrónico de restablecemento de contrasinal, asegúrate de utilizar a URL completa proporcionada.
+ send_instructions: Recibirás un correo electrónico con instrucións sobre como restablecer o teu contrasinal en poucos minutos.
+ send_paranoid_instructions: Se o teu enderezo de correo electrónico existe na nosa base de datos, recibirás unha ligazón de recuperación de contrasinal no teu enderezo de correo electrónico en poucos minutos.
+ updated: O contrasinal cambiou correctamente. Agora iniciaches sesión.
+ updated_not_active: O contrasinal cambiou correctamente.
+ registrations:
+ destroyed: Adeus! Cancelouse correctamente a túa conta. Agardamos verte pronto.
+ edit:
+ cancel_account: Cancelar a conta.
+ current_password: Contrasinal actual
+ edit_user: Editar persoa usuaria
+ help_current_password: Axuda o contrasinal actual
+ help_password: Contrasinal de axuda
+ password: Contrasinal
+ password_confirmation: Confirmación por contrasinal
+ unhappy: Infeliz
+ update: Actualización
+ new:
+ password: Contrasinal
+ password_confirmation: Confirmación por contrasinal
+ sign_me_up: Rexístrate
+ sign_up: Incribirse
+ signed_up: Benvido/a! Rexistrácheste con éxito.
+ signed_up_but_inactive: Rexistrácheste con éxito. Non obstante, non podemos rexistrarte porque a túa conta aínda non está activada.
+ signed_up_but_locked: Rexistrácheste con éxito. Non obstante, non podemos rexistrarte porque a túa conta está bloqueada.
+ signed_up_but_unconfirmed: Enviouse a mensaxe cunha ligazón de confirmación ao teu enderezo de correo electrónico. Abre a ligazón para activar a túa conta.
+ update_needs_confirmation: Actualizaches a túa conta con éxito, pero necesitamos verificar o teu novo enderezo de correo electrónico. Comproba o teu correo electrónico e fai clic na ligazón de confirmación para confirmar a confirmación do teu novo enderezo de correo electrónico.
+ updated: Actualizaches a túa conta correctamente.
+ sessions:
+ new:
+ remember_me: Lémbrame
+ sign_in: Iniciar sesión
+ user:
+ signed_in: Registrado/a
+ signed_out: Pechou a sesión
+ shared:
+ links:
+ didnt_receive_confirmation_instructions: Reenviar correo de confirmación
+ didnt_receive_unlock_instructions: Recibir instrucións de desbloqueo
+ forgot_your_password: Non lembro o meu contrasinal
+ sign_in: Acceder
+ sign_in_with: Iniciar sesión con %{provider}
+ sign_up: Rexistrarse
+ unlocks:
+ new:
+ resend_instructions: Reenviar instrucións de desbloqueo
+ resend_instructions_button: Reenviar
+ resend_instructions_description: Se te rexistraches erroneamente máis de cinco veces tes que facer este paso para desbloquear a túa conta
+ send_instructions: Recibirás un correo electrónico con instrucións sobre como desbloquear a túa conta en poucos minutos.
+ send_paranoid_instructions: Se a túa conta existe, recibirás un correo electrónico con instrucións sobre como desbloqueala en poucos minutos.
+ unlocked: A túa conta foi desbloqueada con éxito. Inicia sesión para continuar.
+ errors:
+ internal_server_error:
+ description: Sentímolo, parece haber un erro con esta solicitude. Enviouse unha notificación de forma automática e resolverémolo o máis axiña posible.
+ title: Error interno do servidor
+ messages:
+ already_confirmed: Xa se confirmou, intenta iniciar sesión
+ confirmation_period_expired: Debe ser confirmado dentro de %{period}, solicite un novo
+ expired: Caducou, por favor solicita un novo
+ not_found: Non atopado
+ not_locked: Non estaba bloqueado
+ not_saved:
+ one: '1 erro prohibiuse que este %{resource} se gardase:'
+ other: "%{count} os erros prohibiron que este %{resource} se garde:"
+ not_found:
+ description: A páxina que estabas a buscar non existe. É posible que teñas mal escrita a dirección ou a páxina mudou.
+ title: Non atopado
+ global:
+ add_new: Crear novo
+ all: Todo
+ amount: Cantidade
+ announcements: Publicar
+ back: De volta
+ balance: 'Balance:'
+ cancel_membership: Borrado permanente
+ contact_details: Datos de contacto
+ date: Datos
+ delete: Eliminar
+ demote: Degradar a usuario/a normal
+ edit: Actualización
+ filter: Filtro
+ give_time: Transferencia de tempo
+ home: Inicio
+ information: Información
+ locales_header: cambiar o idioma
+ member_count: 'Número de persoas usuarias:'
+ more: Máis
+ movements: Transaccións
+ promote: Promover á persoa administradora
+ reason: Razón
+ required_field: "* Campo obrigatorio"
+ save: Gardar
+ search: Busca
+ show: Amosar
+ source_destination: Dende/ata
+ statistics: Estatísticas
+ table:
+ actions: Accións
+ inquiries:
+ edit:
+ submit: Cambiar consulta
+ index:
+ new_inquiry: Nova consulta
+ new:
+ submit: Crear consulta
+ layouts:
+ application:
+ about: Sobre TimeOverflow
+ edit_org: Actualización %{organization}
+ edit_profile: Actualiza o meu perfil
+ help: Axuda
+ login: Acceder
+ report:
+ report_title: INFORME
+ locales:
+ ar: Árabe
+ ca: Catalán
+ en: Inglés
+ es: Español
+ eu: Vasco
+ fr: Francés
+ gl: Galego
+ pt: Portugués
+ pt-BR: Portugués (Brasil)
+ mailers_globals:
+ footer:
+ text: "%{organization_name} de"
+ text_donation: A asociación ADBdT ofrece TimeOverflow gratuitamente aos bancos de tempo. Cunha doazón de %{href} podes axudar a manter e mellorar a plataforma.
+ text_donation_link: 1€ ao mes
+ offers:
+ edit:
+ submit: Cambiar oferta
+ index:
+ by_category: Por categoría
+ by_tag: Por etiqueta
+ filter: Filtrar
+ new_offer: Nova oferta
+ offered_by: Ofrecido por %{size} persoas
+ new:
+ submit: Crear oferta
+ show:
+ give_time_for: Transferencia de tempo para esta oferta
+ offered_by: Ofrecido por
+ organization_notifier:
+ recent_posts:
+ subject: Boletín informativo
+ text1: 'Últimas ofertas publicadas:'
+ text2: 'Publicacións máis recentes:'
+ organizations:
+ give_time:
+ give_time: Dele tempo
+ index:
+ member_count: Número de persoas usuarias
+ new:
+ new: Novo banco
+ show:
+ contact_information: Información de contacto
+ pages:
+ about:
+ app-mobile: Aplicación móbil
+ app-mobile-text: Está dispoñible a aplicación TimeOverflow para móbiles.
Esta aplicación foi posible grazas á colaboración do municipio de Barcelona, o programa %{impulsem_link} (Barcelona Activa) 2017-2018
+ banner-button: Solicitar acceso a TimeOverflow
+ banner-subtitle: Contamos contigo para poñelo en marcha ou para facerche unha demostración
+ banner-title: Es ti un Banco de Tempo?
+ donate-link: Doe 1 € ao mes
+ donate-text: Para soportar moitas comunidades, a asociación ADBdT ofrece a plataforma TimeOverflow a todos os bancos de tempo. %{donate_link} para contribuír aos custos de mantemento e innovación.
+ donate-title: Participa cunha doazón
+ empower-adbdt: ADBdT
+ empower-adbdt-title: Asociación para o Desenvolvemento de Bancos de Tempo
+ empower-coopdevs: CoopDevs
+ empower-coopdevs-title: CoopDevs
+ empower-github: Github
+ empower-github-title: Github
+ empower-showmap: ver o mapa
+ empower-showmap-title: Bancos de Tempo
+ empower-text-1: TimeOveflow está especialmente deseñado para e por Bancos de Tempo que existen físicamente — %{showmap_link}, eo seu propósito é impulsalos grazas a Internet.
+ empower-text-2: Grazas ao traballo conxunto de %{coopdevs_link} e %{abdt_link}, hoxe podemos ofrecer o software TimeOverflow a todos os bancos de tempo que o queiran, abertos e gratuitos.
+ empower-text-3: O código fonte de TimeOverflow está dispoñible en base a unha licenza de código aberto e pode descargala en %{github_link}
+ empower-title: Empoderando os bancos de tempo
+ feature-group-1: Xestión de Banco de tempo con funcións de administración
+ feature-group-2: Rede social e banca en liña accesibles polas persoas membros
+ feature-text-1: Creación / eliminación / actualizacións das persoas membros do banco
+ feature-text-2: Publicación de ofertas e consultas
+ feature-text-3: Inclúe controis e xestión da contabilidade
+ feature-text-4: As persoas membros dun Banco de Tempo poden acceder ao sistema e conectarse con outras persoas membros
+ feature-text-5: Publicación de ofertas e consultas
+ feature-text-6: Pague horas a outras persoas membros
+ impulsem-link: Aumenta o que fas
+ subtitle: TimeOverflow é de código aberto, gratuíto e colaborativo
+ title: O software deseñado por e para
+ title2: Bancos de tempo
+ posts:
+ show:
+ info: Este %{type} pertence a %{organization}.
+ reports:
+ cat_with_users:
+ title: Servizos ofrecidos
+ download: Descarga
+ user_list:
+ title: Lista de persoas usuarias
+ shared:
+ movements:
+ delete_reason: Estás seguro/a de borrar este comentario?
+ movements: Movementos
+ post_form:
+ you_can_use: Podes usar
+ simple_form:
+ error_notification:
+ default_message: 'Revisa os problemas a continuación:'
+ 'no': Non
+ options:
+ user:
+ gender:
+ female: Muller
+ male: Home
+ required:
+ mark: "*"
+ text: esixido
+ 'yes': Si
+ statistics:
+ statistics_all_transfers:
+ date: Data
+ delete_reason: Estás seguro/a de borrar este comentario?
+ from: De
+ post: Publicar
+ quantity: Cantidade
+ reason: Razón
+ to: Para
+ transfers: Todas as transferencias
+ statistics_demographics:
+ by_ages: Por idades
+ by_gender: Por sexo
+ demographics: Datos demográficos
+ female: Muller
+ male: Home
+ num_people: "# de persoas"
+ unknown: Descoñecido
+ statistics_global_activity:
+ bank_activity: Actividade bancaria
+ end_date: final mm/aaaa
+ global_activity: Actividade global
+ ini_date: ini mm/aaaa
+ num_swaps: Transaccións
+ per_month: Por mes
+ show: Amosar
+ total_hours: Horas transferidas
+ users_reg: Persoas usuarias rexistradas
+ statistics_inactive_users:
+ days_without_swaps: Días sen transaccións
+ inactive_users: Persoas usuarias inactivas
+ last_movement: Última transacción
+ no_movements: Sen transaccións
+ statistics_last_login:
+ last_login: Último inicio de sesión
+ never_login: Nunca iniciou sesión
+ statistics_type_swaps:
+ type_of_swaps: Tipo de transaccións
+ without_category: Sen categoría
+ without_tags: Sen etiquetas
+ statistics_without_offers:
+ without_offers: Sen ofertas
+ stats:
+ min_balance:
+ title: Saldo mínimo das persoas usuarias
+ tags:
+ alpha_grouped_index:
+ maintitle: Etiquetas dispoñibles
+ terms:
+ accept: Aceptar
+ show:
+ accept: Aceptar
+ transfers:
+ computation:
+ hour:
+ one: "%{count} hora"
+ other: "%{count} horas"
+ joiner: e
+ minute:
+ one: "%{count} minuto"
+ other: "%{count} minutos"
+ new:
+ error_amount: O tempo debe ser superior a 0
+ users:
+ edit:
+ edit_user: Actualizar persoa usuaria
+ form:
+ notifications: Notificacións
+ give_time:
+ give_time: Dálle tempo
+ index:
+ actions: Accións
+ active_warning: Vas cambiar o estado da conta de usuario/a %{username}
+ active_warning_angular: Vas cambiar o estado da conta de usuario/a para {{username}}
+ cancel_warning: Vas borrar a conta do Banco de tempo para o usuario/a %{username}
+ cancel_warning_angular: Vas borrar a conta do Banco de tempo para o usuario/a {{username}}
+ create: Crea unha nova persoa usuaria
+ manage_warning: Vas cambiar privilexios para o usuario/a %{username}
+ manage_warning_angular: Vas cambiar privilexios para o usuario/a {{username}}
+ members: Persoas membros
+ user_created: O usuario/a %{uid} %{name} gardouse
+ member_card:
+ active_ago: Tempo activo %{time}
+ no_activity: Non hai actividade
+ new:
+ cancel: Cancelar
+ create_more_users_button: Crea e engade outra persoa usuaria
+ new_user: Nova persoa usuaria
+ user_created_add: A persoa usuaria %{uid} %{name} gardada, agora crea o seguinte
+ show:
+ account: Últimas transaccións
+ accounts: Contas
+ balance: 'Balance:'
+ categories: Servizos ofrecidos
+ change_your_image: Cambia a túa imaxe
+ created_at: 'Rexistrado/a:'
+ data: Datos da persoa usuaria
+ date: Data
+ deleted_user: A persoa usuaria xa non existe
+ from_to: De / Para
+ inactive: "(Inactivo/a)"
+ inactive_user: A persoa usuaria non está activa
+ phone:
+ one: Teléfono
+ other: Teléfonos
+ post: Publicar
+ quantity: Cantidade
+ reason: Razón
+ user_no: 'Usuario/a #:'
+ user_rows:
+ activate: Activar
+ active_warning: Vas cambiar o estado da conta de usuario/a para %{user}
+ cancel_warning: Vas borrar a conta do Banco de tempo para o usuario/a %{user}
+ deactivate: Desactivar
+ manage_warning: Vas cambiar privilexios para o usuario/a %{user}
+ views:
+ pagination:
+ first: Primeira
+ last: Última
+ next: Seguinte
+ previous: Anterior
+ truncate: Truncar
diff --git a/config/routes.rb b/config/routes.rb
index ead5c2497..f28c54013 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -16,7 +16,7 @@
ActiveAdmin.routes(self)
- get "global/switch_lang", as: :switch_lang
+ get :switch_lang, to: 'application#switch_lang'
get "/pages/:page" => "pages#show", as: :page
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
new file mode 100644
index 000000000..58f34db3a
--- /dev/null
+++ b/spec/controllers/application_controller_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+RSpec.describe ApplicationController do
+ describe '#switch_lang' do
+ let(:original_locale) { I18n.locale }
+
+ before do
+ request.env["HTTP_REFERER"] = root_path
+ end
+
+ after do
+ I18n.locale = original_locale
+ end
+
+ it 'switches locale to passed language via params' do
+ new_locale = (I18n.available_locales - [original_locale]).sample
+
+ expect do
+ get :switch_lang, locale: new_locale
+ end.to change(I18n, :locale).from(original_locale).to(new_locale)
+
+ expect(response).to redirect_to(root_path)
+ end
+ end
+end
diff --git a/spec/features/brand_logo_spec.rb b/spec/features/brand_logo_spec.rb
new file mode 100644
index 000000000..bd89399f3
--- /dev/null
+++ b/spec/features/brand_logo_spec.rb
@@ -0,0 +1,41 @@
+require 'spec_helper'
+
+RSpec.feature 'sign in' do
+ let(:user) do
+ user = Fabricate(
+ :user,
+ email: 'user@timeoverflow.org',
+ password: 'papapa22',
+ terms_accepted_at: 1.day.from_now
+ )
+
+ user.add_to_organization(organization)
+
+ user
+ end
+
+ let(:organization) { Fabricate(:organization) }
+
+ context 'with a branded org id' do
+ before do
+ allow(Rails.application.config).to receive(:branded_organization_id).and_return(organization.id)
+ sign_in_with(user.email, user.password)
+ end
+
+ it 'renders the logo' do
+ expect(page).to have_css('.organization-brand-logo')
+ end
+ end
+
+ context 'without a branded org id' do
+ before do
+ allow(Rails.application.config).to receive(:branded_organization_id).and_return(1234)
+ sign_in_with(user.email, user.password)
+ end
+
+ it 'does not render the logo' do
+ expect(page).to have_no_css('.organization-brand-logo')
+ end
+ end
+end
+
diff --git a/spec/features/create_offer_spec.rb b/spec/features/create_offer_spec.rb
index 75b9a107d..523e7b4c3 100644
--- a/spec/features/create_offer_spec.rb
+++ b/spec/features/create_offer_spec.rb
@@ -31,8 +31,6 @@
# TODO there are two i18n keys for getting "Crear oferta" copy ( one returns 'Crear oferta' and the other 'Crear Oferta' )
click_on I18n.t('offers.new.submit', model: I18n.t('activerecord.models.offer.one'))
-
- page.save_screenshot('create-offer-yolo.png')
end
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 894bd9ac4..7a75c877f 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,4 +1,6 @@
-# This file is copied to spec/ when you run 'rails generate rspec:install'
+require 'simplecov'
+SimpleCov.start 'rails'
+
ENV["RAILS_ENV"] ||= 'test'
ENV["ADMINS"] = "admin@timeoverflow.org"
@@ -8,30 +10,25 @@
require 'capybara/rspec'
require 'database_cleaner'
require 'fabrication'
+require 'chromedriver-helper'
require 'selenium/webdriver'
require 'faker'
require 'shoulda/matchers'
-I18n.reload!
-
-Capybara.register_driver :chrome do |app|
- Capybara::Selenium::Driver.new(app, browser: :chrome)
-end
-
+Capybara.server = :webrick
Capybara.register_driver :headless_chrome do |app|
- capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
- chromeOptions: { args: %w(headless disable-gpu) }
+ browser_options = Selenium::WebDriver::Chrome::Options.new(
+ args: %w(headless disable-gpu no-sandbox)
)
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
- desired_capabilities: capabilities
+ options: browser_options
)
end
-
-Capybara.javascript_driver = :headless_chrome
Capybara.default_driver = :headless_chrome
+Capybara.javascript_driver = Capybara.default_driver
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.