diff --git a/app/controllers/statistics_controller.rb b/app/controllers/statistics_controller.rb
index fb9ff9728..458af84b9 100644
--- a/app/controllers/statistics_controller.rb
+++ b/app/controllers/statistics_controller.rb
@@ -74,6 +74,7 @@ def statistics_inactive_users
def statistics_demographics
@members = current_organization.members
@age_counts = age_counts
+ @gender_counts = gender_counts
end
def statistics_last_login
@@ -168,4 +169,16 @@ def age_counts
counts[age_label] += 1
end
end
+
+ def gender_counts
+ @members.each_with_object(Hash.new(0)) do |member, counts|
+ gender = member.user_gender
+ gender_label = if gender.present?
+ t("simple_form.options.user.gender.#{gender}")
+ else
+ t("statistics.statistics_demographics.unknown")
+ end
+ counts[gender_label] += 1
+ end
+ end
end
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 59dfc93f1..75ac944cb 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -1,4 +1,8 @@
module UsersHelper
+ def genders_collection
+ User::GENDERS.map(&:to_sym)
+ end
+
def phone_to(phone)
link_to phone, "tel://#{phone}"
end
diff --git a/app/models/user.rb b/app/models/user.rb
index b3e7d3252..807dd0262 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -3,7 +3,6 @@ class User < ActiveRecord::Base
devise *[
:database_authenticatable,
- # :registerable,
:recoverable,
:rememberable,
:confirmable,
@@ -12,7 +11,12 @@ class User < ActiveRecord::Base
:timeoutable
]
- GENDERS = %w[male female]
+ GENDERS = %w(
+ female
+ male
+ other
+ prefer_not_to_answer
+ )
attr_accessor :empty_email
@@ -38,6 +42,7 @@ class User < ActiveRecord::Base
# emails like 'without email'
validates_format_of :email,
with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
+ validates :gender, inclusion: { in: GENDERS, allow_blank: true }
def as_member_of(organization)
organization && members.find_by(organization: organization)
diff --git a/app/views/statistics/statistics_demographics.html.erb b/app/views/statistics/statistics_demographics.html.erb
index eb5d6a195..a7071ef1d 100644
--- a/app/views/statistics/statistics_demographics.html.erb
+++ b/app/views/statistics/statistics_demographics.html.erb
@@ -3,22 +3,15 @@
diff --git a/app/views/users/_form.html.erb b/app/views/users/_form.html.erb
index 638b79fa6..f2b32484b 100644
--- a/app/views/users/_form.html.erb
+++ b/app/views/users/_form.html.erb
@@ -14,6 +14,7 @@
<%= f.input :phone %>
<%= f.input :alt_phone %>
+ <%= f.input :gender, collection: genders_collection %>
<%= f.input :date_of_birth,
start_year: Date.today.year - 90,
end_year: Date.today.year - 12,
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index ac0405a9b..27032e144 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -435,6 +435,8 @@ ca:
gender:
female: Dona
male: Home
+ other: Altre
+ prefer_not_to_answer: Prefereixo no contestar
required:
mark: "*"
text: required
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 0bdfdcba8..c45e6d651 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -435,6 +435,8 @@ en:
gender:
female: Female
male: Male
+ other: Other
+ prefer_not_to_answer: I prefer not to answer
required:
mark: "*"
text: required
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 91d5c69fa..5f698e2eb 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -435,6 +435,8 @@ es:
gender:
female: Mujer
male: Hombre
+ other: Otro
+ prefer_not_to_answer: Prefiero no contestar
required:
mark: "*"
text: necesario
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index b75c4b0d5..b7a30fadd 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -441,6 +441,8 @@ eu:
gender:
female: Emakumea
male: Gizona
+ other:
+ prefer_not_to_answer:
required:
mark: "*"
text: Beharrezkoa
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 4fb04e053..f9e12c213 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -435,6 +435,8 @@ gl:
gender:
female: Muller
male: Home
+ other:
+ prefer_not_to_answer:
required:
mark: "*"
text: esixido
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index be2496192..185b50cb0 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -435,6 +435,8 @@ pt-BR:
gender:
female: Mulher
male: Homem
+ other:
+ prefer_not_to_answer:
required:
mark: "*"
text: Necessário
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index c37a39111..1ecab1cfc 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -17,6 +17,8 @@
it { is_expected.to validate_presence_of :username }
+ it { is_expected.to validate_inclusion_of(:gender).in_array(User::GENDERS) }
+
describe "#setup_and_save_user" do
it "sets a fake email before attempting to save user" do
user = Fabricate.build(:user, email: "")