From 84bed4f9ce7b7cbb4d5cae02d2845f02d2f10c0c Mon Sep 17 00:00:00 2001 From: James Kiesel Date: Wed, 17 Dec 2014 01:07:15 +1300 Subject: [PATCH] Remove group name validation case sensitivity --- app/models/group.rb | 2 +- config/locales/server.en.yml | 2 +- ...216112341_resolve_duplicate_group_names.rb | 23 +++++++++++++++++++ spec/models/group_spec.rb | 6 +++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20141216112341_resolve_duplicate_group_names.rb diff --git a/app/models/group.rb b/app/models/group.rb index 2a451f192..1d9ba3721 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -10,7 +10,7 @@ class Group < ActiveRecord::Base after_save :destroy_deletions validate :name_format_validator - validates_uniqueness_of :name + validates_uniqueness_of :name, case_sensitive: false AUTO_GROUPS = { :everyone => 0, diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 64c6e6ab4..c36126ec1 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -54,7 +54,7 @@ en: messages: too_long_validation: "is limited to %{max} characters; you entered %{length}." invalid_boolean: "Invalid boolean." - taken: "has already been taken" + taken: "has already been taken. (group names are case insensitive)" embed: load_from_remote: "There was an error loading that post." diff --git a/db/migrate/20141216112341_resolve_duplicate_group_names.rb b/db/migrate/20141216112341_resolve_duplicate_group_names.rb new file mode 100644 index 000000000..63a49e4b6 --- /dev/null +++ b/db/migrate/20141216112341_resolve_duplicate_group_names.rb @@ -0,0 +1,23 @@ +class ResolveDuplicateGroupNames < ActiveRecord::Migration + + def up + results = Group.exec_sql 'SELECT id FROM groups + WHERE name ILIKE + (SELECT lower(name) + FROM groups + GROUP BY lower(name) + HAVING count(*) > 1);' + + groups = Group.where id: results.map { |r| r['id'] } + groups.group_by { |g| g.name.downcase }.each do |key, value| + value.each_with_index do |dup, index| + dup.update! name: "#{dup.name[0..18]}_#{index+1}" if index > 0 + end + end + end + + def down + # does not reverse changes + end + +end diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index d71a20c4d..ba56e3887 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -27,6 +27,12 @@ describe Group do group.name = "this is_a_name" group.valid?.should == false end + + it "is invalid for case-insensitive existing names" do + build(:group, name: 'this_is_a_name').save + group.name = 'This_Is_A_Name' + group.valid?.should == false + end end def real_admins