aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/category_and_heading_migrator.rb91
-rw-r--r--lib/public_body_categories.rb61
-rw-r--r--lib/public_body_categories_en.rb19
3 files changed, 97 insertions, 74 deletions
diff --git a/lib/category_and_heading_migrator.rb b/lib/category_and_heading_migrator.rb
new file mode 100644
index 000000000..402ea7204
--- /dev/null
+++ b/lib/category_and_heading_migrator.rb
@@ -0,0 +1,91 @@
+module CategoryAndHeadingMigrator
+
+ # This module migrates data from public_body_categories_[locale].rb files
+ # into PublicBodyHeading and PublicBodyCategory models
+
+ # Load all the data from public_body_categories_[locale].rb files.
+ def self.migrate_categories_and_headings
+ if PublicBodyCategory.count > 0
+ puts "PublicBodyCategories exist already, not migrating."
+ else
+ @first_locale = true
+ I18n.available_locales.each do |locale|
+ begin
+ load "public_body_categories_#{locale}.rb"
+ rescue MissingSourceFile
+ end
+ @first_locale = false
+ end
+ end
+ end
+
+ # Load the categories and headings for a locale
+ def self.add_categories_and_headings_from_list(locale, data_list)
+ # set the counter for headings loaded from this locale
+ @@locale_heading_display_order = 0
+ current_heading = nil
+ data_list.each do |list_item|
+ if list_item.is_a?(Array)
+ # item is list of category data
+ add_category(list_item, current_heading, locale)
+ else
+ # item is heading name
+ current_heading = add_heading(list_item, locale, @first_locale)
+ end
+ end
+ end
+
+ def self.add_category(category_data, heading, locale)
+ tag, title, description = category_data
+ category = PublicBodyCategory.find_by_category_tag(tag)
+ if category
+ add_category_in_locale(category, title, description, locale)
+ else
+ category = PublicBodyCategory.create(:category_tag => tag,
+ :title => title,
+ :description => description)
+
+ # add the translation if this is not the default locale
+ # (occurs when a category is not defined in default locale)
+ unless category.translations.map { |t| t.locale }.include?(locale)
+ add_category_in_locale(category, title, description, locale)
+ end
+ end
+ heading.add_category(category)
+ end
+
+ def self.add_category_in_locale(category, title, description, locale)
+ I18n.with_locale(locale) do
+ category.title = title
+ category.description = description
+ category.save
+ end
+ end
+
+ def self.add_heading(name, locale, first_locale)
+ heading = nil
+ I18n.with_locale(locale) do
+ heading = PublicBodyHeading.find_by_name(name)
+ end
+ # For multi-locale installs, we assume that all public_body_[locale].rb files
+ # use the same headings in the same order, so we add translations to the heading
+ # that was in the same position in the list loaded from other public_body_[locale].rb
+ # files.
+ if heading.nil? && !@first_locale
+ heading = PublicBodyHeading.where(:display_order => @@locale_heading_display_order).first
+ end
+
+ if heading
+ I18n.with_locale(locale) do
+ heading.name = name
+ heading.save
+ end
+ else
+ I18n.with_locale(locale) do
+ heading = PublicBodyHeading.create(:name => name)
+ end
+ end
+ @@locale_heading_display_order += 1
+ heading
+ end
+end
diff --git a/lib/public_body_categories.rb b/lib/public_body_categories.rb
index 7f548b130..3528e85b1 100644
--- a/lib/public_body_categories.rb
+++ b/lib/public_body_categories.rb
@@ -1,60 +1,11 @@
-# lib/public_body_categories.rb:
-# Categorisations of public bodies.
-#
-# Copyright (c) 2009 UK Citizens Online Democracy. All rights reserved.
-# Email: hello@mysociety.org; WWW: http://www.mysociety.org/
-
+# Allow the PublicBodyCategory model to be addressed using the same syntax
+# as the old PublicBodyCategories class without needing to rename everything,
+# make sure we're not going to break any themes
class PublicBodyCategories
- attr_reader :with_description,
- :with_headings,
- :tags,
- :by_tag,
- :singular_by_tag,
- :by_heading,
- :headings
-
- def initialize(categories)
- @with_headings = categories
- # Arranged in different ways for different sorts of displaying
- @with_description = @with_headings.select() { |a| a.instance_of?(Array) }
- @tags = @with_description.map() { |a| a[0] }
- @by_tag = Hash[*@with_description.map() { |a| a[0..1] }.flatten]
- @singular_by_tag = Hash[*@with_description.map() { |a| [a[0],a[2]] }.flatten]
- @by_heading = {}
- heading = nil
- @headings = []
- @with_headings.each do |row|
- if ! row.instance_of?(Array)
- heading = row
- @headings << row
- @by_heading[row] = []
- else
- @by_heading[heading] << row[0]
- end
- end
- end
-
-
- def PublicBodyCategories.get
- load_categories if @@CATEGORIES.empty?
- @@CATEGORIES[I18n.locale.to_s] || @@CATEGORIES[I18n.default_locale.to_s] || PublicBodyCategories.new([])
+ def self.method_missing(method, *args, &block)
+ warn 'Use of PublicBodyCategories is deprecated and will be removed in release 0.21. Please use PublicBodyCategory instead.'
+ PublicBodyCategory.send(method, *args, &block)
end
- # Called from the data files themselves
- def PublicBodyCategories.add(locale, categories)
- @@CATEGORIES[locale.to_s] = PublicBodyCategories.new(categories)
- end
-
- private
- @@CATEGORIES = {}
-
- def PublicBodyCategories.load_categories()
- I18n.available_locales.each do |locale|
- begin
- load "public_body_categories_#{locale}.rb"
- rescue MissingSourceFile
- end
- end
- end
end
diff --git a/lib/public_body_categories_en.rb b/lib/public_body_categories_en.rb
deleted file mode 100644
index 95eed750b..000000000
--- a/lib/public_body_categories_en.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# The PublicBodyCategories structure works like this:
-# [
-# "Main category name",
-# [ "tag_to_use_as_category", "Sub category title", "sentence that can describes things in this subcategory" ],
-# [ "another_tag", "Second sub category title", "another descriptive sentence for things in this subcategory"],
-# "Another main category name",
-# [ "another_tag_2", "Another sub category title", "another descriptive sentence"]
-# ])
-#
-# DO NOT EDIT THIS FILE! It should be overridden in a custom theme.
-# See doc/THEMES.md for more info
-
-PublicBodyCategories.add(:en, [
- "Silly ministries",
- [ "useless_agency", "Useless ministries", "a useless ministry" ],
- [ "lonely_agency", "Lonely agencies", "a lonely agency"],
- "Popular agencies",
- [ "popular_agency", "Popular agencies", "a lonely agency"]
-])