diff options
author | Mark Longair <mhl@pobox.com> | 2014-01-03 16:52:04 +0000 |
---|---|---|
committer | Mark Longair <mhl@pobox.com> | 2014-01-14 09:14:13 +0000 |
commit | ef0594552843014c32a7f2e75e7bcd7a1e265156 (patch) | |
tree | bc9b66414c485e3960e4c8617cac707820300813 | |
parent | 3e3b7a0d5a1401b18c88683581a545708c65aaf0 (diff) |
Ignore translations when finding the internal admin body
If you change the default locale after having set up your site,
and exception would always be thrown by
PublicBody.internal_admin_body, which looks up that distinguished
body based on url_name. Since that's a translated field, and
there would be no translation for it in the new locale, it
wouldn't be found, and the code would try to create a second
internal_admin_body, which would fail because of the url_name
being non-unque in public_bodies.
There are various ways of fixing this; the one introduced in this
commit is to use raw SQL to find the public body, bypassing the
public_body_translations table.
Fixes #1001.
-rw-r--r-- | app/models/public_body.rb | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/app/models/public_body.rb b/app/models/public_body.rb index 933825d2a..a78a6677e 100644 --- a/app/models/public_body.rb +++ b/app/models/public_body.rb @@ -346,22 +346,26 @@ class PublicBody < ActiveRecord::Base # The "internal admin" is a special body for internal use. def PublicBody.internal_admin_body - I18n.with_locale(I18n.default_locale) do - pb = PublicBody.find_by_url_name("internal_admin_authority") - if pb.nil? - pb = PublicBody.new( - :name => 'Internal admin authority', - :short_name => "", - :request_email => AlaveteliConfiguration::contact_email, - :home_page => "", - :notes => "", - :publication_scheme => "", - :last_edit_editor => "internal_admin", - :last_edit_comment => "Made by PublicBody.internal_admin_body" - ) - pb.save! + # Use find_by_sql to avoid the search being specific to a + # locale, since url_name is a translated field: + sql = "SELECT * FROM public_bodies WHERE url_name = 'internal_admin_authority'" + matching_pbs = PublicBody.find_by_sql sql + case + when matching_pbs.empty? then + I18n.with_locale(I18n.default_locale) do + PublicBody.create!(:name => 'Internal admin authority', + :short_name => "", + :request_email => AlaveteliConfiguration::contact_email, + :home_page => "", + :notes => "", + :publication_scheme => "", + :last_edit_editor => "internal_admin", + :last_edit_comment => "Made by PublicBody.internal_admin_body") end - return pb + when matching_pbs.length == 1 then + matching_pbs[0] + else + raise "Multiple public bodies (#{matching_pbs.length}) found with url_name 'internal_admin_authority'" end end |