From b6b60854d710e690f26c1bf3eb8f077aa0162040 Mon Sep 17 00:00:00 2001 From: Marc Anguera Insa Date: Wed, 13 Feb 2019 21:47:07 +0100 Subject: [PATCH 01/10] add simplecov --- Gemfile | 1 + Gemfile.lock | 7 +++++++ spec/spec_helper.rb | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index be0f9309f..7b292ddea 100644 --- a/Gemfile +++ b/Gemfile @@ -64,6 +64,7 @@ group :test do gem 'capybara', '~> 2.7' gem 'capybara-selenium', '~> 0.0.6' gem 'chromedriver-helper', '~> 1.0' + gem 'simplecov', '~> 0.16.1', require: false end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 8dcf90423..231ad6572 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -124,6 +124,7 @@ 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) @@ -350,6 +351,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) @@ -443,6 +449,7 @@ DEPENDENCIES 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/spec/spec_helper.rb b/spec/spec_helper.rb index 894bd9ac4..d27bafd68 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" From 362db096fe320692fe03f38a0c821151223ba6ab Mon Sep 17 00:00:00 2001 From: Marc Anguera Insa Date: Thu, 14 Feb 2019 21:07:05 +0100 Subject: [PATCH 02/10] upgrade capybara and chromedriver-helper --- Gemfile | 8 ++++---- Gemfile.lock | 37 ++++++++++++++++++------------------- spec/spec_helper.rb | 11 +++-------- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/Gemfile b/Gemfile index be0f9309f..d7371516b 100644 --- a/Gemfile +++ b/Gemfile @@ -60,10 +60,10 @@ group :test do 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' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index bb95fa0ac..bc228d404 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) @@ -149,11 +147,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 +286,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) @@ -334,9 +333,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) @@ -390,7 +389,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,9 +405,8 @@ 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) @@ -417,7 +415,7 @@ DEPENDENCIES elasticsearch-model elasticsearch-rails fabrication - faker + faker (~> 1.9) has_scope hstore_translate http_accept_language (~> 2.1.1) @@ -439,6 +437,7 @@ DEPENDENCIES 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) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 894bd9ac4..fac37f2e5 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,16 +8,12 @@ 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) } @@ -29,9 +25,8 @@ desired_capabilities: capabilities ) 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. From ac2e1cbcfa7be674a151af05784561ae8304f538 Mon Sep 17 00:00:00 2001 From: Marc Anguera Insa Date: Thu, 14 Feb 2019 21:48:56 +0100 Subject: [PATCH 03/10] capybara: use newer selenium api to configure headless chrome driver --- spec/spec_helper.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index fac37f2e5..946559b7a 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -15,14 +15,14 @@ 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.default_driver = :headless_chrome From 01456563f80fbcf13614b6064bb986beb9f8d046 Mon Sep 17 00:00:00 2001 From: Marc Anguera Insa Date: Wed, 20 Feb 2019 22:18:12 +0100 Subject: [PATCH 04/10] remove unused store_location + move switch_lang action to ApplicationController --- app/controllers/application_controller.rb | 20 +++++--------------- app/controllers/global_controller.rb | 5 ----- config/routes.rb | 2 +- 3 files changed, 6 insertions(+), 21 deletions(-) delete mode 100644 app/controllers/global_controller.rb 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/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 From 2dda06f6e2a0e15be830b4b347c4d38521b1c234 Mon Sep 17 00:00:00 2001 From: Marc Anguera Insa Date: Thu, 21 Feb 2019 00:07:15 +0100 Subject: [PATCH 05/10] specs: add spec for switch_lang action --- .../application_controller_spec.rb | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 spec/controllers/application_controller_spec.rb 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 From a681c79045ed1c4dc3d59bbacc8fd9216ea611d7 Mon Sep 17 00:00:00 2001 From: Marc Anguera Insa Date: Wed, 6 Mar 2019 22:27:43 +0100 Subject: [PATCH 06/10] upgrade rspec-rails and dotenv-rails to latest stable version --- Gemfile | 4 ++-- Gemfile.lock | 36 ++++++++++++++++++------------------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Gemfile b/Gemfile index d7371516b..2f4bb81a2 100644 --- a/Gemfile +++ b/Gemfile @@ -48,15 +48,15 @@ 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' diff --git a/Gemfile.lock b/Gemfile.lock index bc228d404..6d0cfa9fe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -124,10 +124,10 @@ GEM diff-lcs (1.3) 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) @@ -296,23 +296,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) @@ -411,7 +411,7 @@ DEPENDENCIES 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 @@ -432,7 +432,7 @@ 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) From 7160f6a11679e423b082154360d42ab0ea2dc880 Mon Sep 17 00:00:00 2001 From: sseerrggii Date: Tue, 12 Mar 2019 19:08:29 +0100 Subject: [PATCH 07/10] Add GL language --- config/locales/gl.yml | 557 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 557 insertions(+) create mode 100644 config/locales/gl.yml 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 From 3d83b6c521d0b6a3b25550aafc32142d688ef802 Mon Sep 17 00:00:00 2001 From: sseerrggii Date: Tue, 12 Mar 2019 19:09:08 +0100 Subject: [PATCH 08/10] add GL to menu --- config/application.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. From 56612cc70abbdd02e82775acc20ae9daee440b21 Mon Sep 17 00:00:00 2001 From: Jorge Morante Date: Wed, 27 Feb 2019 17:48:31 +0100 Subject: [PATCH 09/10] add branded organization logo --- app/assets/images/redeira.png | Bin 0 -> 24652 bytes app/helpers/brand_logo_helper.rb | 16 ++++++++ app/views/application/_brand_logo.html.erb | 3 ++ app/views/layouts/application.html.erb | 1 + config/initializers/branded_organization.rb | 7 ++++ spec/features/brand_logo_spec.rb | 41 ++++++++++++++++++++ spec/features/create_offer_spec.rb | 2 - 7 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/redeira.png create mode 100644 app/helpers/brand_logo_helper.rb create mode 100644 app/views/application/_brand_logo.html.erb create mode 100644 config/initializers/branded_organization.rb create mode 100644 spec/features/brand_logo_spec.rb diff --git a/app/assets/images/redeira.png b/app/assets/images/redeira.png new file mode 100644 index 0000000000000000000000000000000000000000..1806f0428636194971097b7388e882e95dbe00ef GIT binary patch literal 24652 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 tU+aU$%bnifEj->U{av1K9uo literal 0 HcmV?d00001 diff --git a/app/helpers/brand_logo_helper.rb b/app/helpers/brand_logo_helper.rb new file mode 100644 index 000000000..ecbe7b51c --- /dev/null +++ b/app/helpers/brand_logo_helper.rb @@ -0,0 +1,16 @@ +module BrandLogoHelper + def render_brand_logo + return unless should_render_logo? + render 'application/brand_logo' + end + + private + + def should_render_logo? + 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/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/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 From f8e1f5ed733b9b7b16b1bd1da7a875ae9f7b2352 Mon Sep 17 00:00:00 2001 From: Enrico Stano Date: Thu, 14 Mar 2019 19:06:14 +0100 Subject: [PATCH 10/10] Update app/helpers/brand_logo_helper.rb Co-Authored-By: Morantron --- app/helpers/brand_logo_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/brand_logo_helper.rb b/app/helpers/brand_logo_helper.rb index ecbe7b51c..bc02bb1eb 100644 --- a/app/helpers/brand_logo_helper.rb +++ b/app/helpers/brand_logo_helper.rb @@ -7,6 +7,7 @@ def render_brand_logo private def should_render_logo? + return false unless current_user current_organization&.id == branded_organization_id end