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.