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: "")