9 Commits

Author SHA1 Message Date
8ababb1d7a docs: document missing ENV variables for mailing and assets (#833)
Some checks failed
CI / test (push) Has been cancelled
Docker Build / test (push) Has been cancelled
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 10:08:15 +02:00
966b68e876 fix: skip seeds when running in production environment (#832)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-07 10:07:19 +02:00
eea06a5633 feat(admin): allow admins to confirm users and set passwords (#834)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-07 10:02:31 +02:00
808a6ba663 feat: dutch translation (#826) 2026-04-06 20:12:53 +02:00
b515afbe5f build(deps): bump aws-sdk-s3 from 1.176.1 to 1.208.0 (#823)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 10:59:20 +01:00
d94197e690 build(deps): bump rack from 2.2.19 to 2.2.20 (#819)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-11 10:27:34 +02:00
61bc9ca7bb build(deps): bump rack from 2.2.18 to 2.2.19 (#818)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-07 22:34:18 +02:00
d381a8e56a build(deps): bump rack from 2.2.14 to 2.2.18 (#816)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-25 21:53:25 +02:00
721ef83bca build(deps-dev): bump rexml from 3.4.1 to 3.4.2 (#815)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 22:10:35 +02:00
18 changed files with 811 additions and 15 deletions

View File

@ -22,6 +22,7 @@ MAIL_LINK_HOST=localhost:3000
MAIL_LINK_PROTO=http MAIL_LINK_PROTO=http
# Email provider # Email provider
MAILER_SENDER=noreply@timeoverflow.org
SMTP_PASSWORD=XXXXXXXX SMTP_PASSWORD=XXXXXXXX
SMTP_DOMAIN=www.timeoverflow.org SMTP_DOMAIN=www.timeoverflow.org
SMTP_USER_NAME=my_username@timeoverflow.org SMTP_USER_NAME=my_username@timeoverflow.org

View File

@ -22,7 +22,7 @@ gem 'prawn-table', '~> 0.2.2'
gem 'pg_search', '~> 2.3.5' gem 'pg_search', '~> 2.3.5'
gem 'sidekiq', '~> 6.5' gem 'sidekiq', '~> 6.5'
gem 'sidekiq-cron', '~> 1.12.0' gem 'sidekiq-cron', '~> 1.12.0'
gem 'aws-sdk-s3', '~> 1.94', require: false gem 'aws-sdk-s3', '~> 1.208', require: false
gem 'image_processing', '~> 1.12' gem 'image_processing', '~> 1.12'
gem 'active_storage_validations', '~> 1.1.3' gem 'active_storage_validations', '~> 1.1.3'

View File

@ -95,21 +95,24 @@ GEM
ast (2.4.3) ast (2.4.3)
autoprefixer-rails (10.4.19.0) autoprefixer-rails (10.4.19.0)
execjs (~> 2) execjs (~> 2)
aws-eventstream (1.3.0) aws-eventstream (1.4.0)
aws-partitions (1.1029.0) aws-partitions (1.1196.0)
aws-sdk-core (3.214.0) aws-sdk-core (3.240.0)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0) aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9) aws-sigv4 (~> 1.9)
base64
bigdecimal
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.96.0) logger
aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (1.118.0)
aws-sdk-core (~> 3, >= 3.239.1)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.176.1) aws-sdk-s3 (1.208.0)
aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-core (~> 3, >= 3.234.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.5)
aws-sigv4 (1.10.1) aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
base64 (0.3.0) base64 (0.3.0)
bcrypt (3.1.20) bcrypt (3.1.20)
@ -283,7 +286,7 @@ GEM
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
raabro (1.4.0) raabro (1.4.0)
racc (1.8.1) racc (1.8.1)
rack (2.2.14) rack (2.2.20)
rack-session (1.0.2) rack-session (1.0.2)
rack (< 3) rack (< 3)
rack-test (2.2.0) rack-test (2.2.0)
@ -343,7 +346,7 @@ GEM
responders (3.1.1) responders (3.1.1)
actionpack (>= 5.2) actionpack (>= 5.2)
railties (>= 5.2) railties (>= 5.2)
rexml (3.4.1) rexml (3.4.2)
rspec-core (3.13.2) rspec-core (3.13.2)
rspec-support (~> 3.13.0) rspec-support (~> 3.13.0)
rspec-expectations (3.13.3) rspec-expectations (3.13.3)
@ -478,7 +481,7 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
active_storage_validations (~> 1.1.3) active_storage_validations (~> 1.1.3)
activeadmin (~> 3.2) activeadmin (~> 3.2)
aws-sdk-s3 (~> 1.94) aws-sdk-s3 (~> 1.208)
bootsnap (~> 1.12) bootsnap (~> 1.12)
bootstrap (~> 5.3.3) bootstrap (~> 5.3.3)
byebug (~> 11.0) byebug (~> 11.0)

View File

@ -72,6 +72,8 @@ In order to configure the application you can use the following ENV variables:
| `SECRET_KEY_BASE` | Secret key for the application, generate a new one with the command `rails secret` | | | `SECRET_KEY_BASE` | Secret key for the application, generate a new one with the command `rails secret` | |
| `DATABASE_URL` | Database URL, the format is `postgresql://user:password@host:port/database` | | | `DATABASE_URL` | Database URL, the format is `postgresql://user:password@host:port/database` | |
| `RAILS_SERVE_STATIC_FILES` | Tell the application to serve static files (you might want to turn this off if you are using an external web server to serve files from the `public` folder) | `true` | | `RAILS_SERVE_STATIC_FILES` | Tell the application to serve static files (you might want to turn this off if you are using an external web server to serve files from the `public` folder) | `true` |
| `RAILS_ASSET_HOST` | CDN or external host to serve assets from (ie: `cdn.mydomain.tld`) | |
| `ASSETS_PRECOMPILE` | Set to `true` to enable asset precompilation with compression during startup | |
| `RAILS_LOG_TO_STDOUT` | Tell the application to log to STDOUT (useful for Docker) | `true` | | `RAILS_LOG_TO_STDOUT` | Tell the application to log to STDOUT (useful for Docker) | `true` |
| `RAILS_LOG_LEVEL` | Log level for the application (use `debug` for maximum information) | `info` | | `RAILS_LOG_LEVEL` | Log level for the application (use `debug` for maximum information) | `info` |
| `RAILS_MAX_THREADS` | Maximum number of threads to use in the application (use `1` if multithreading is not desired) | `5` | | `RAILS_MAX_THREADS` | Maximum number of threads to use in the application (use `1` if multithreading is not desired) | `5` |
@ -83,7 +85,8 @@ In order to configure the application you can use the following ENV variables:
| `STORAGE_PROVIDER` | Storage provider for the application (currently the application supports `local` and `amazon`) | `amazon` | | `STORAGE_PROVIDER` | Storage provider for the application (currently the application supports `local` and `amazon`) | `amazon` |
| `FORCE_SSL` | Force SSL connections | `false` | | `FORCE_SSL` | Force SSL connections | `false` |
| `MAIL_LINK_HOST` | Host to use in the links sent by email (use your domain without protocol `mydomain.tld`) | | | `MAIL_LINK_HOST` | Host to use in the links sent by email (use your domain without protocol `mydomain.tld`) | |
| `MAIL_LINK_PROTOCOL` | Protocol to use in the previous host defined for links sent by email | `https` | | `MAIL_LINK_PROTO` | Protocol to use in the previous host defined for links sent by email | `https` |
| `MAILER_SENDER` | Email address used as the sender for Devise emails (ie: `noreply@mydomain.tld`) | `please-change-me-at-config-initializers-devise@example.com` |
| `SMTP_ADDRESS` | SMTP server address (ie: `smtp.mailgun.org`) | | | `SMTP_ADDRESS` | SMTP server address (ie: `smtp.mailgun.org`) | |
| `SMTP_PORT` | SMTP server port (ie: `587`) | | | `SMTP_PORT` | SMTP server port (ie: `587`) | |
| `SMTP_DOMAIN` | SMTP domain (usually the application's domain) | | | `SMTP_DOMAIN` | SMTP domain (usually the application's domain) | |

View File

@ -5,6 +5,14 @@ ActiveAdmin.register User do
link_to I18n.t("active_admin.users.upload_from_csv"), action: "upload_csv" link_to I18n.t("active_admin.users.upload_from_csv"), action: "upload_csv"
end end
action_item :confirm, only: :show do
unless user.confirmed?
link_to I18n.t("active_admin.users.confirm_user"),
confirm_admin_user_path(user),
method: :put
end
end
collection_action :upload_csv do collection_action :upload_csv do
render "admin/csv/upload_csv" render "admin/csv/upload_csv"
end end
@ -16,6 +24,15 @@ ActiveAdmin.register User do
redirect_to action: :index redirect_to action: :index
end end
member_action :confirm, method: :put do
resource.skip_confirmation!
if resource.save
redirect_to admin_user_path(resource), notice: I18n.t("active_admin.users.confirmed_notice")
else
redirect_to admin_user_path(resource), alert: resource.errors.full_messages.to_sentence
end
end
scope :all scope :all
scope :without_memberships scope :without_memberships
@ -32,6 +49,7 @@ ActiveAdmin.register User do
column :posts do |u| column :posts do |u|
u.posts.count u.posts.count
end end
column :confirmed_at
column :created_at column :created_at
actions actions
end end
@ -53,6 +71,9 @@ ActiveAdmin.register User do
f.input :postcode f.input :postcode
f.input :gender, as: :select, collection: User::GENDERS f.input :gender, as: :select, collection: User::GENDERS
f.input :locale, as: :select, collection: I18n.available_locales f.input :locale, as: :select, collection: I18n.available_locales
f.input :password, required: false, input_html: { autocomplete: "new-password" }
f.input :password_confirmation, required: false, input_html: { autocomplete: "new-password" }
f.input :confirm_immediately, as: :boolean if f.object.new_record?
end end
f.inputs "Memberships" do f.inputs "Memberships" do
f.has_many :members, allow_destroy: true do |m| f.has_many :members, allow_destroy: true do |m|
@ -91,6 +112,22 @@ ActiveAdmin.register User do
end end
end end
permit_params :username, :email, :phone, :postcode, :gender, :locale, permit_params :username, :email, :phone, :postcode, :gender, :locale, :confirm_immediately,
:password, :password_confirmation,
members_attributes: [:id, :organization_id, :active, :manager, :_destroy] members_attributes: [:id, :organization_id, :active, :manager, :_destroy]
controller do
def create_resource(obj)
obj.skip_confirmation! if obj.confirm_immediately
super
end
def update_resource(obj, attributes)
if attributes.first[:password].blank?
attributes.first.delete(:password)
attributes.first.delete(:password_confirmation)
end
super
end
end
end end

View File

@ -22,6 +22,7 @@ class User < ApplicationRecord
attr_accessor :empty_email attr_accessor :empty_email
attr_accessor :from_signup attr_accessor :from_signup
attribute :confirm_immediately, :boolean
has_one_attached :avatar has_one_attached :avatar

View File

@ -13,7 +13,7 @@ module Timeoverflow
# I18n configuration # I18n configuration
config.i18n.default_locale = :es config.i18n.default_locale = :es
config.i18n.available_locales = [:es, :ca, :eu, :gl, :en, :'pt-BR', :fr, :ja] config.i18n.available_locales = [:es, :ca, :eu, :gl, :en, :'pt-BR', :fr, :ja, :'nl-NL']
config.i18n.fallbacks = true config.i18n.fallbacks = true
# This tells Rails to serve error pages from the app itself, rather than using static error pages in public/ # This tells Rails to serve error pages from the app itself, rather than using static error pages in public/

View File

@ -2,6 +2,8 @@ ca:
active_admin: active_admin:
users: users:
organization: Banc de temps organization: Banc de temps
confirm_user: Confirmar usuari
confirmed_notice: Usuari confirmat correctament
upload_csv: Fitxer upload_csv: Fitxer
upload_from_csv: Importar CSV upload_from_csv: Importar CSV
activerecord: activerecord:
@ -70,6 +72,7 @@ ca:
registration_date: Data d'alta registration_date: Data d'alta
registration_number: Codi d'usuari registration_number: Codi d'usuari
superadmin: SuperAdministrador del Sistema superadmin: SuperAdministrador del Sistema
confirm_immediately: Confirmar immediatament
unconfirmed_email: Correu sense confirmar unconfirmed_email: Correu sense confirmar
updated_at: Actualitzat updated_at: Actualitzat
username: Nom username: Nom
@ -357,6 +360,7 @@ ca:
gl: Gallec gl: Gallec
pt-BR: Portuguès pt-BR: Portuguès
ja: ja:
nl-NL: Holandès
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name} en" text: "%{organization_name} en"

View File

@ -2,6 +2,8 @@ en:
active_admin: active_admin:
users: users:
organization: Time bank organization: Time bank
confirm_user: Confirm user
confirmed_notice: User confirmed successfully
upload_csv: File upload_csv: File
upload_from_csv: Upload CSV upload_from_csv: Upload CSV
activerecord: activerecord:
@ -70,6 +72,7 @@ en:
registration_date: Registration date registration_date: Registration date
registration_number: User code registration_number: User code
superadmin: System Administrator superadmin: System Administrator
confirm_immediately: Confirm immediately
unconfirmed_email: Unconfirmed Email unconfirmed_email: Unconfirmed Email
updated_at: Updated updated_at: Updated
username: Name username: Name
@ -356,6 +359,7 @@ en:
gl: Galician gl: Galician
pt-BR: Portuguese pt-BR: Portuguese
ja: Japanese ja: Japanese
nl-NL: Dutch
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name} from" text: "%{organization_name} from"

View File

@ -2,6 +2,8 @@ es:
active_admin: active_admin:
users: users:
organization: Banco de tiempo organization: Banco de tiempo
confirm_user: Confirmar usuario
confirmed_notice: Usuario confirmado correctamente
upload_csv: Fichero upload_csv: Fichero
upload_from_csv: Importar CSV upload_from_csv: Importar CSV
activerecord: activerecord:
@ -70,6 +72,7 @@ es:
registration_date: Fecha de alta registration_date: Fecha de alta
registration_number: Código de usuario registration_number: Código de usuario
superadmin: Administrador de sistema superadmin: Administrador de sistema
confirm_immediately: Confirmar inmediatamente
unconfirmed_email: Correo sin confirmar unconfirmed_email: Correo sin confirmar
updated_at: Actualizado updated_at: Actualizado
username: Nombre username: Nombre
@ -359,6 +362,7 @@ es:
gl: Gallego gl: Gallego
pt-BR: Portugués pt-BR: Portugués
ja: Japonés ja: Japonés
nl-NL: Holandès
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name} en" text: "%{organization_name} en"

View File

@ -2,6 +2,8 @@ eu:
active_admin: active_admin:
users: users:
organization: Denbora Bankua organization: Denbora Bankua
confirm_user: Erabiltzailea baieztatu
confirmed_notice: Erabiltzailea berretsita
upload_csv: Fitxategia upload_csv: Fitxategia
upload_from_csv: Igo CSVa upload_from_csv: Igo CSVa
activerecord: activerecord:
@ -70,6 +72,7 @@ eu:
registration_date: Erregistratze-da registration_date: Erregistratze-da
registration_number: Erabiltzaile kodea registration_number: Erabiltzaile kodea
superadmin: Sistema administratzailea superadmin: Sistema administratzailea
confirm_immediately: Berehala baieztatu
unconfirmed_email: Baieztatu gabeko eposta unconfirmed_email: Baieztatu gabeko eposta
updated_at: Eguneratua updated_at: Eguneratua
username: Izena username: Izena
@ -357,6 +360,7 @@ eu:
gl: Galiziera gl: Galiziera
pt-BR: Portugesa pt-BR: Portugesa
ja: ja:
nl-NL: Holandera
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name}tik" text: "%{organization_name}tik"

View File

@ -2,6 +2,8 @@ fr:
active_admin: active_admin:
users: users:
organization: Banque de temps organization: Banque de temps
confirm_user: "Confirmer l'utilisateur"
confirmed_notice: "Utilisateur confirmé avec succès"
upload_csv: Fichier upload_csv: Fichier
upload_from_csv: Uploader un CSV upload_from_csv: Uploader un CSV
activerecord: activerecord:
@ -70,6 +72,7 @@ fr:
registration_date: Date d'inscription registration_date: Date d'inscription
registration_number: Numéro d'inscription registration_number: Numéro d'inscription
superadmin: Administrateur système superadmin: Administrateur système
confirm_immediately: Confirmer immédiatement
unconfirmed_email: Adresse email non-confirmée unconfirmed_email: Adresse email non-confirmée
updated_at: Mis·e à jour le updated_at: Mis·e à jour le
username: Nom username: Nom
@ -358,6 +361,7 @@ fr:
gl: Galicien gl: Galicien
pt-BR: Portugais pt-BR: Portugais
ja: ja:
nl-NL: Néerlandais
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name} de" text: "%{organization_name} de"

View File

@ -2,6 +2,8 @@ gl:
active_admin: active_admin:
users: users:
organization: Banco de tempo organization: Banco de tempo
confirm_user: Confirmar usuario
confirmed_notice: Usuario confirmado correctamente
upload_csv: Ficheiro upload_csv: Ficheiro
upload_from_csv: Importar CSV upload_from_csv: Importar CSV
activerecord: activerecord:
@ -70,6 +72,7 @@ gl:
registration_date: Data de rexistro registration_date: Data de rexistro
registration_number: Código de persoa usuaria registration_number: Código de persoa usuaria
superadmin: Persoa dministradora do sistema superadmin: Persoa dministradora do sistema
confirm_immediately: Confirmar inmediatamente
unconfirmed_email: Correo electrónico non confirmado unconfirmed_email: Correo electrónico non confirmado
updated_at: Actualizado updated_at: Actualizado
username: Nome username: Nome
@ -357,6 +360,7 @@ gl:
gl: Galego gl: Galego
pt-BR: Portugués (Brasil) pt-BR: Portugués (Brasil)
ja: ja:
nl-NL: Holandés
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name} de" text: "%{organization_name} de"

View File

@ -2,6 +2,8 @@ ja:
active_admin: active_admin:
users: users:
organization: タイムバンク organization: タイムバンク
confirm_user: ユーザーを確認
confirmed_notice: ユーザーが確認されました
upload_csv: ファイル upload_csv: ファイル
upload_from_csv: CSVをインポート upload_from_csv: CSVをインポート
activerecord: activerecord:
@ -70,6 +72,7 @@ ja:
registration_date: 登録日 registration_date: 登録日
registration_number: ユーザー番号 registration_number: ユーザー番号
superadmin: システム管理者 superadmin: システム管理者
confirm_immediately: すぐに確認する
unconfirmed_email: 未確認メールアドレス unconfirmed_email: 未確認メールアドレス
updated_at: 更新 updated_at: 更新
username: 名前 username: 名前
@ -324,6 +327,7 @@ ja:
gl: ガリシア語 gl: ガリシア語
pt-BR: ブラジルポルトガル語 pt-BR: ブラジルポルトガル語
ja: 日本語 ja: 日本語
nl-NL: オランダ語
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name}から" text: "%{organization_name}から"

635
config/locales/nl-NL.yml Normal file
View File

@ -0,0 +1,635 @@
nl-NL:
active_admin:
users:
organization: Tijdbank
upload_csv: Bestand
upload_from_csv: CSV uploaden
activerecord:
attributes:
account:
balance: Balans
organization: Organisatie
category:
created_at: Aangemaakt
name: Naam
name_translations: Naam (vertalingen)
parent: Hoofdcategorie
updated_at: Bijgewerkt
common:
created_at: Aangemaakt
updated_at: Bijgewerkt
inquiry:
is_group: Groepsverzoek
offer:
is_group: Groepsaanbieding
organization:
address: Adres
city: Plaats
created_at: Aangemaakt
description: Omschrijving
email: E-mail
name: Naam
neighborhood: Buurt
phone: Telefoonnummer
public_opening_times: Openingstijden
reg_number_seq: Gebruikersvolgnummer
updated_at: Bijgewerkt
post:
category: Categorie
created_at: Aangemaakt
description: Omschrijving
end_on: Eindigt op
start_on: Begint op
tag_list: Labels
title: Titel
updated_at: Bijgewerkt
transfer:
amount: Aantal
created_at: Aangemaakt
hours: Uren
minutes: Minuten
post: Bericht
reason: Reacties
source: Bron
updated_at: Bijgewerkt
user:
admin: Organisatiebeheerder
alt_phone: Alternatief telefoonnummer
created_at: Aangemaakt
date_of_birth: Geboortedatum
deactivated: Gedeactiveerd
description: Omschrijving
email: E-mail
gender: Geslacht
last_sign_in_at: Laatste login
notifications: E-mailmeldingen ontvangen
organization: Organisatie
phone: Telefoonnummer
postcode: Postcode
push_notifications: Mobiele meldingen ontvangen
registration_date: Registratiedatum
registration_number: Gebruikerscode
superadmin: Systeembeheerder
unconfirmed_email: Onbevestigd e-mailadres
updated_at: Bijgewerkt
username: Naam
errors:
models:
organization:
attributes:
web:
url_format_invalid: Ongeldige URL-indeling
transfer:
attributes:
base:
same_account: Een overdracht kan niet overgemaakt worden naar
hetzelfde account
user:
attributes:
email:
invalid: ongeldig
models:
category:
one: Categorie
other: Categorieën
comment:
one: Opmerking
other: Opmerkingen
inquiry:
one: Verzoek
other: Verzoeken
offer:
one: Aanbieding
other: Aanbiedingen
organization:
one: Tijdbank
other: Tijdbanken
post:
one: Bericht
other: Berichten
transfer:
one: Overboeking
other: Overboekingen
user:
one: Gebruiker
other: Gebruikers
application:
landing:
button: Invoeren
slogan: Laten we onze tijd waarderen
sub_slogan: Er is een tijdbank bij u in de buurt
login_form:
button: Invoeren
email: E-mail
password: Wachtwoord
remember_check: Onthoud mij
menu:
sign_in: Inloggen
sing_out: Uitloggen
menus:
offers_by_tag_link:
tags: Labels
navbar:
admin: Beheren
administration: Administratie
adminshort: Beheer
all_transfers: Alle overboekingen
categories: Diensten
demographics: Demografische gegevens
global_activity: Wereldwijde activiteit
inactive_users: Inactieve gebruikers
inquiry_public_link: Openbare link naar verzoeken
last_login: Laatste login
offer_public_link: Openbare link naar aanbiedingen
organizations: Organisaties
reports: Rapporten
sign_out: Uitloggen
statistics: Statistieken
statistics_all_transfers: Alle overboekingen
stats: Statistieken
tags: Labels
type_of_swaps: Type transacties
users: Gebruikers
without_offers: Zonder aanbiedingen
terms_conditions: Gebruiksvoorwaarden
tips:
entertag: Voer labels gescheiden door komma's in
user_not_found: Gebruiker niet gevonden.
devise:
confirmations:
confirmed: Uw account is succesvol bevestigd.
confirmed_and_signed_in: Uw account is succesvol bevestigd. U bent nu ingelogd.
new:
resend_instructions: Instructies voor het opnieuw verzenden van de bevestiging
resend_instructions_button: Opnieuw verzenden
resend_instructions_description: Als u uw e-mailadres hebt gewijzigd,
moet u het volgende doen
send_instructions: U ontvangt binnen enkele minuten een e-mail met
instructies voor het bevestigen van uw account.
send_paranoid_instructions: Als uw e-mailadres in onze database staat,
ontvangt u binnen enkele minuten een e-mail met instructies voor het
bevestigen van uw account.
failure:
already_authenticated: U bent al ingelogd.
inactive: Uw account is nog niet geactiveerd.
invalid: Ongeldig e-mailadres of wachtwoord.
invalid_token: Ongeldig authenticatietoken.
locked: Uw account is geblokkeerd.
not_found_in_database: Ongeldig e-mailadres of wachtwoord.
timeout: Uw sessie is verlopen. Log opnieuw in om verder te gaan.
unauthenticated: U moet inloggen of registreren voordat u verder kunt gaan.
unconfirmed: U moet uw account bevestigen voordat u verder kunt gaan.
user:
last_attempt: Let op, u hebt nog één poging voordat uw account wordt geblokkeerd
mailer:
confirmation_instructions:
subject: Bevestigingsinstructies
reset_password_instructions:
subject: Instructies voor het opnieuw instellen van uw wachtwoord
unlock_instructions:
subject: Instructies voor ontgrendelen
omniauth_callbacks:
failure: Authenticatie vanaf %{kind} is niet mogelijk vanwege "%{reason}".
success: Authenticatie vanaf %{kind} account is succesvol voltooid.
passwords:
edit:
change_password: Mijn wachtwoord wijzigen
confirm_password: Bevestig uw nieuwe wachtwoord
new_password: Nieuw wachtwoord
passwords_not_match: Wachtwoorden komen niet overeen
new:
forgot_question: Een nieuw wachtwoord aanmaken
forgot_question_description: Voer het e-mailadres in dat aan uw account
is gekoppeld en wij sturen u een e-mail met een link om een nieuw
wachtwoord aan te maken.
send_instructions: Link verzenden
no_token: U hebt geen toegang tot deze pagina als u niet via een e-mail
voor het opnieuw instellen van uw wachtwoord op deze pagina terecht bent
gekomen. Als u via zo'n e-mail komt, zorg er dan voor dat u de volledige
URL gebruikt.
send_instructions: U ontvangt binnen enkele minuten een e-mail met
instructies voor het opnieuw instellen van uw wachtwoord.
send_paranoid_instructions: Als uw e-mailadres in onze database staat,
ontvangt u binnen enkele minuten een link voor wachtwoordherstel op uw
e-mailadres.
updated: Uw wachtwoord is succesvol gewijzigd. U bent nu ingelogd.
updated_not_active: Uw wachtwoord is succesvol gewijzigd.
registrations:
destroyed: Tot ziens! Uw account is succesvol geannuleerd. We hopen u
snel weer te zien.
edit:
cancel_account: Account annuleren
current_password: Huidig wachtwoord
edit_user: Gebruiker bewerken
help_current_password: Hulp bij huidig wachtwoord
help_password: Hulp bij wachtwoord
password: Wachtwoord
password_confirmation: Wachtwoordbevestiging
unhappy: Niet tevreden
update: Bijwerken
new:
password: Wachtwoord
password_confirmation: Wachtwoordbevestiging
sign_me_up: Meld me aan
sign_up: Aanmelden
signed_up: Welkom! U bent succesvol aangemeld.
signed_up_but_inactive: U hebt zich succesvol aangemeld. We konden u
echter niet inloggen omdat uw account nog niet is geactiveerd.
signed_up_but_locked: U hebt zich succesvol aangemeld. We konden u echter
niet inloggen omdat uw account is geblokkeerd.
signed_up_but_unconfirmed: Er is een bericht met een bevestigingslink
naar uw e-mailadres verzonden. Open de link om uw account te activeren.
update_needs_confirmation: U account is succesvol bijgewerkt, maar we
moeten uw nieuwe e-mailadres nog verifiëren. Controleer uw e-mail en klik
op de bevestigingslink om de verificatie van uw nieuwe e-mailadres af te
ronden.
updated: U hebt uw account succesvol bijgewerkt.
sessions:
new:
remember_me: Onthoud mij
sign_in: Inloggen
user:
signed_in: Ingelogd
signed_out: Uitgelogd
shared:
links:
didnt_receive_confirmation_instructions: Bevestigingsmail opnieuw verzenden
didnt_receive_unlock_instructions: Ontgrendelingsinstructies ontvangen
forgot_your_password: Ik weet mijn wachtwoord niet meer
sign_in: Inloggen
sign_in_with: Inloggen met %{provider}
sign_up: Registreren
unlocks:
new:
resend_instructions: Ontgrendelingsinstructies opnieuw verzenden
resend_instructions_button: Opnieuw verzenden
resend_instructions_description: Als u per ongeluk meer dan vijf keer
bent ingelogd, moet u deze stap uitvoeren om uw account te
ontgrendelen.
send_instructions: U ontvangt binnen enkele minuten een e-mail met
instructies voor het ontgrendelen van uw account.
send_paranoid_instructions: Als uw account bestaat, ontvangt u binnen
enkele minuten een e-mail met instructies voor het ontgrendelen ervan.
unlocked: Uw account is succesvol ontgrendeld. Log in om verder te gaan.
errors:
internal_server_error:
description: Het spijt ons, er lijkt een fout te zijn opgetreden bij dit
verzoek. We hebben automatisch een melding ontvangen en zullen dit zo
snel mogelijk oplossen.
title: Interne serverfout
messages:
already_confirmed: is al bevestigd, probeer opnieuw in te loggen
confirmation_period_expired: Moet binnen %{period} bevestigd worden, vraag een nieuwe aan
expired: is verlopen, vraag een nieuwe aan
not_found: niet gevonden
not_locked: was niet vergrendeld
not_saved:
one: '1 fout verhinderde dat deze %{resource} kon worden opgeslagen:'
other: "%{count} fouten verhinderden dat deze %{resource} kon worden opgeslagen:"
not_found:
description: De pagina die u zocht bestaat niet. Mogelijk hebt u het
adres verkeerd ingetypt of is de pagina verplaatst.
title: Niet gevonden
global:
add_new: Nieuw aanmaken
all: Alles
amount: Aantal
announcements: Bericht
back: Terug
balance: 'Saldo:'
cancel_membership: Permanente verwijdering
contact_details: Contactgegevens
create: Aanmaken
date: Gegevens
decline: Weigeren
delete: Verwijderen
demote: Degraderen naar normale gebruiker
edit: Bijwerken
enter_to_timebank: Toevoegen aan tijdbank
filter: Filter
from: Van
give_time: Tijdsoverdracht
here: hier
home: Home
information: Informatie
locales_header: taal wijzigen
member_count: 'Aantal gebruikers:'
more: Meer
movements: Transacties
next: Volgende
or: of
promote: Promotie tot beheerder
reason: Reden
required_field: "* Verplicht veld"
save: Opslaan
search: Zoeken
search_location: Zoeken op locatie
show: Tonen
source_destination: Van/tot
statistics: Statistieken
table:
actions: Acties
to: Naar
inquiries:
edit:
submit: Verzoek wijzigen
index:
new_inquiry: Nieuw verzoek
new:
submit: Verzoek aanmaken
layouts:
application:
about: Over TimeOverflow
bdtnear: Tijdbank doorzoeken
edit_org: Bijwerken %{organization}
edit_profile: Mijn profiel bijwerken
help: Help
login: Inloggen
manage_memberships: Lidmaatschappen beheren
no_memberhsip_warning: Uw registratie is voltooid zodra u een verzoek
hebt ingediend om lid te worden van een Timebank en de Timebank uw
verzoek heeft geaccepteerd. Als u binnen 30 dagen geen verzoek indient
om lid te worden van een Timebank, wordt uw gebruikersaccount uit het
systeem verwijderd.
report:
report_title: REPORT
locales:
ca: Catalan
en: English
es: Spanish
eu: Basque
fr: French
gl: Galician
pt-BR: Portuguese
ja: Japanese
nl-NL: Nederlands
mailers_globals:
footer:
text: "%{organization_name} van"
text_donation: De ADBdT-vereniging biedt TimeOverflow gratis aan tijdbanken aan. Als u wilt helpen bij het onderhouden en verbeteren van het platform, kunt u %{href}.
text_donation_link: bezoek deze website
multi_transfers:
multi_transfers: Meerdere overboekingen
step:
confirm:
description: Bevestig de wijzigingen
type_of_transfer: Type overboeking
select_type:
description: Selecteer het type overboeking
set_params:
description: Geef het over te maken bedrag, de reden en de boeking
(indien van toepassing) op.
set_source:
description: Selecteer de rekening(en) waarnaar de tijd wordt overgeboekt
set_target:
description: Selecteer de rekening(en) die de tijd ontvangt
success: Succesvol aangemaakte overboekingen
types:
many_to_one: Veel-op-één
one_to_many: Eén-op-veel
one_to_one: Eén-op-één
offers:
edit:
submit: Aanbod wijzigen
index:
by_category: Per categorie
by_tag: Per label
filtek: Filter
new_offer: Nieuw aanbod
offered_by: Aangeboden door %{size} personen
new:
submit: Aanbod aanmaken
show:
give_time_for: Tijdsoverdracht voor dit aanbod
offered_by: Aangeboden door
organization_notifier:
member_deleted:
body: Gebruiker %{username} heeft zich afgemeld bij de organisatie.
recent_posts:
subject: Nieuwsbrief
text1: 'Laatst gepubliceerde aanbiedingen:'
text2: 'Laatst gepubliceerde aanvragen:'
organizations:
give_time:
give_time: Tijd geven aan
index:
member_count: Aantal gebruikers
new:
new: Nieuwe bank
show:
contact_information: Contactgegevens
join_timebank: Neem gerust contact op met de tijdbank om u aan te melden
of vragen te stellen.
pages:
about:
app-mobile: Mobiele app
app-mobile-text: De mobiele app TimeOverflow is beschikbaar. <br /> Deze app is mogelijk gemaakt dankzij de samenwerking met de gemeente Barcelona, programma %{impulsem_link} (Barcelona Activa) 2017-2018.
banner-button: Toegang tot TimeOverflow aanvragen
banner-subtitle: We nemen contact met u op om de app te starten of een demonstratie te geven
banner-title: Bent u een Tijdbank?
empower-adbdt: ADBdT
empower-adbdt-title: Vereniging voor de Ontwikkeling van Tijdbanken
empower-coopdevs: Coopdevs
empower-coopdevs-title: Coopdevs
empower-github: Github
empower-github-title: Github
empower-showmap: zie kaart
empower-showmap-title: Tijdbanken
empower-text-1: TimeOveflow is speciaal ontworpen voor en door Time Banks
die fysiek bestaan &mdash; %{showmap_link} en het doel ervan is om ze
te versterken dankzij internet.
empower-text-2: Dankzij de gezamenlijke inspanningen van %{coopdevs_link}
en %{abdt_link} kunnen we de software TimeOverflow vandaag gratis en open
aanbieden aan alle tijdbanken die er gebruik van willen maken.
empower-text-3: De broncode van TimeOverflow is beschikbaar onder een
open source-licentie en je kunt deze downloaden via %{github_link}.
empower-title: Het versterken van de tijdbanken
feature-group-1: Tijdbankbeheer met beheerdersrollen
feature-group-2: Sociaal netwerk en online bankieren toegankelijk voor leden
feature-text-1: Aanmaken/verwijderen/bijwerken van bankleden
feature-text-2: Plaatsen van aanbiedingen en aanvragen
feature-text-3: Invoeren van cheques en beheren van de boekhouding
feature-text-4: Leden van een tijdbank hebben toegang tot het systeem en
kunnen verbinding maken met anderen
feature-text-5: Plaatsen van aanbiedingen en aanvragen
feature-text-6: Uren uitbetalen aan andere leden
impulsem-link: Impulsem el que fas
subtitle: TimeOverflow is open source, gratis en collaboratief
title: De software is ontworpen door en voor
title2: Tijdbanken
petitions:
application_sent: Aanvraag correct verzonden
application_sent_body: Hallo! Uw sollicitatie bij %{organization_name} is correct verzonden.
application_status: Aanvraag %{status}
applications: Aanvragen
apply: Aanmelden
new: Nieuwe aanvraag
new_body: Hallo, %{username} heeft zojuist een verzoek ingediend om lid te worden van %{organization_name} Tijdbank. U kunt %{here_link} invoeren om het verzoek te accepteren of af te wijzen. Zodra u het verzoek accepteert, verschijnt de gebruiker automatisch in uw gebruikerslijst.
status:
accepted: geaccepteerd
declined: afgewezen
pending: in behandeling
sent: verzonden
status_applications: "%{status} aanvragen"
posts:
show:
info: Deze %{type} behoort tot %{organization}.
reports:
download: Downloaden
download_all: Alles downloaden
shared:
movements:
delete_reason: Weet je zeker dat je deze reactie wilt verwijderen?
movements: Uitwisselingen
post_form:
group_inquiry: Is dit een groepsverzoek?
group_offer: Is dit een groepsaanbieding?
you_can_use: Je kunt gebruiken
simple_form:
error_notification:
default_message: 'Bekijk de onderstaande problemen:'
'nee': 'Nee'
options:
user:
gender:
female: Vrouw
male: Man
others: Anders
prefer_not_to_answer: Ik geef er de voorkeur aan om niet te antwoorden
required:
mark: "*"
text: verplicht
'ja': 'Ja'
statistics:
all_transfers:
date: Datum
delete_reason: Weet je zeker dat je deze reactie wilt verwijderen?
from: Van
post: Bericht
quantity: Aantal
reason: Reden
to: Naar
transfers: Alle overboekingen
demographics:
by_ages: Per leeftijd
by_gender: Per geslacht
demographics: Demografische gegevens
female: Vrouw
male: Man
num_people: "# aantal personen"
unknown: Onbekend
global_activity:
bank_activity: Bankactiviteit
global_activity: Wereldwijde activiteit
num_swaps: " Transacties"
per_month: Per maand
show: Weergeven
total_hours: " antal overgeboekte uren"
users_reg: " Geregistreerde gebruikers"
inactive_users:
days_without_swaps: Dagen zonder transacties
inactive_users: Inactieve gebruikers
last_movement: Laatste transactie
no_movements: Zonder transacties
last_login:
last_login: Laatste login
never_login: Nooit ingelogd
type_swaps:
type_of_swaps: Type transacties
without_category: Zonder categorie
without_tags: Zonder tags
without_offers:
without_offers: Zonder aanbiedingen
stats:
min_balance:
title: Minimumsaldo gebruikers
tags:
alpha_grouped_index:
maintitle: Beschikbare labels
terms:
accept: Accepteren
show:
accept: Accepteren
transfers:
computation:
hour:
one: "%{count} uur"
other: "%{count} uur"
joiner: " en "
minute:
one: "%{count} minuut"
other: "%{count} minuten"
new:
error_amount: Tijd moet groter zijn dan 0
users:
avatar:
change_your_image: Uw afbeelding wijzigen
crop_the_image: Afbeelding bijsnijden
max_size_warning: Afbeelding is te groot, maximaal toegestaan is %{size}MB
confirm_email:
email_sent: Er is een e-mail verzonden naar %{email}. Na bevestiging kunt
u solliciteren bij elke organisatie.
please: Bevestig het e-mailadres
edit:
edit_user: Gebruiker bijwerken
form:
notifications: Meldingen
give_time:
give_time: Geef het even de tijd
index:
account_deactivated: Uw account is gedeactiveerd in deze tijdbank
actions: Acties
active_warning: U gaat de accountstatus van gebruiker %{username} wijzigen
cancel_warning: U gaat het account van gebruiker %{username} verwijderen
uit de tijdbank
create: Nieuwe gebruiker aanmaken
deactivated_warning: Als u denkt dat uw account per ongeluk is
gedeactiveerd, neem dan contact op met de beheerder via onderstaande
gegevens.
manage_warning: U gaat de rechten van gebruiker %{username} wijzigen
members: Leden
user_created: Gebruiker %{uid} %{name} opgeslagen
member_card:
active_ago: Actief %{time} geleden
no_activity: Geen activiteit
new:
cancel: Annuleren
create_more_users_button: Een andere gebruiker aanmaken en toevoegen
new_user: Nieuwe gebruiker
user_created_add: Gebruiker %{uid} %{name} opgeslagen, maak nu de volgende aan
show:
account: Last transactions
accounts: Accounts
balance: 'Saldo:'
categories: Aangeboden services
created_at: 'Geregistreerd:'
data: Gebruikersgegevens
date: Datum
deleted_user: De gebruiker bestaat niet meer
from_to: Van/Tot
inactive: "(Inactief)"
inactive_user: De gebruiker is niet actief
invalid_format: Ongeldig formaat, kies een ".jpg", ".jpeg" of ".png".
phone:
one: Telefoon
other: Telefoons
post: Bericht
quantity: Aantal
reason: Reden
user_no: 'Gebruiker #:'
user_rows:
activate: Activeren
active_warning: U gaat de accountstatus van gebruiker %{user} wijzigen
cancel_warning: U gaat het account van gebruiker %{user} uit de Tijdbank verwijderen
deactivate: Deactiveren
delete_membership: Lidmaatschap verwijderen
manage_warning: U gaat de rechten van gebruiker %{user} wijzigen
sure_delete: Weet u zeker dat u uw lidmaatschap van %{organization_name}
wilt verwijderen?
views:
pagination:
first: Eerst
last: Laatste
next: Volgende
previous: Vorige
truncate: Afkorten

View File

@ -2,6 +2,8 @@ pt-BR:
active_admin: active_admin:
users: users:
organization: Banco de Tempo organization: Banco de Tempo
confirm_user: Confirmar usuário
confirmed_notice: Usuário confirmado com sucesso
upload_csv: Arquivo upload_csv: Arquivo
upload_from_csv: Importar CSV upload_from_csv: Importar CSV
activerecord: activerecord:
@ -70,6 +72,7 @@ pt-BR:
registration_date: Data de ingresso registration_date: Data de ingresso
registration_number: Código do usuário registration_number: Código do usuário
superadmin: Administrador do sistema superadmin: Administrador do sistema
confirm_immediately: Confirmar imediatamente
unconfirmed_email: E-mail sem confirmação unconfirmed_email: E-mail sem confirmação
updated_at: Atualizado updated_at: Atualizado
username: Nome username: Nome
@ -357,6 +360,7 @@ pt-BR:
gl: Galego gl: Galego
pt-BR: Português pt-BR: Português
ja: ja:
nl-NL: Holandês
mailers_globals: mailers_globals:
footer: footer:
text: "%{organization_name} em" text: "%{organization_name} em"

View File

@ -1,3 +1,8 @@
if Rails.env.production? && ENV["SEED_DEMO_DATA"] != "true"
puts "Skipping seeds in production environment. Set SEED_DEMO_DATA=true to allow demo seeds."
return
end
Organization.find_or_create_by(name: "Banco de Tiempo Local") Organization.find_or_create_by(name: "Banco de Tiempo Local")
Organization.find_or_create_by(name: "El otro Banco de Tiempo :)") Organization.find_or_create_by(name: "El otro Banco de Tiempo :)")

View File

@ -0,0 +1,79 @@
RSpec.describe Admin::UsersController, type: :controller do
let(:organization) { Fabricate(:organization) }
let(:member) { Fabricate(:member, organization: organization) }
let(:user) { member.user }
before do
login(user)
allow(controller).to receive(:authenticate_superuser!).and_return(true)
end
describe "PUT #confirm" do
context "when the user is unconfirmed" do
let(:unconfirmed_user) { Fabricate(:user, confirmed_at: nil) }
it "confirms the user and redirects with notice" do
put :confirm, params: { id: unconfirmed_user.id }
expect(unconfirmed_user.reload.confirmed?).to be true
expect(response).to redirect_to(admin_user_path(unconfirmed_user))
expect(flash[:notice]).to eq(I18n.t("active_admin.users.confirmed_notice"))
end
end
context "when the user is already confirmed" do
it "re-confirms and redirects with notice" do
put :confirm, params: { id: user.id }
expect(response).to redirect_to(admin_user_path(user))
expect(flash[:notice]).to eq(I18n.t("active_admin.users.confirmed_notice"))
end
end
end
describe "POST #create" do
let(:valid_params) do
{ username: "newuser", email: "new@example.com", locale: "en" }
end
context "with confirm_immediately checked" do
it "creates a confirmed user" do
post :create, params: { user: valid_params.merge(confirm_immediately: "1") }
created_user = User.find_by(email: "new@example.com")
expect(created_user).to be_confirmed
end
end
context "without confirm_immediately checked" do
it "creates an unconfirmed user" do
post :create, params: { user: valid_params.merge(confirm_immediately: "0") }
created_user = User.find_by(email: "new@example.com")
expect(created_user).not_to be_confirmed
end
end
end
describe "PUT #update" do
context "when password is blank" do
it "does not change the existing password" do
original_encrypted = user.encrypted_password
put :update, params: { id: user.id, user: { password: "", password_confirmation: "" } }
expect(user.reload.encrypted_password).to eq(original_encrypted)
end
end
context "when password is provided" do
it "updates the password" do
original_encrypted = user.encrypted_password
put :update, params: { id: user.id, user: { password: "newpassword123", password_confirmation: "newpassword123" } }
expect(user.reload.encrypted_password).not_to eq(original_encrypted)
end
end
end
end