diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/admin_public_body_category_controller.rb | 19 | ||||
-rw-r--r-- | app/models/public_body_category.rb | 46 | ||||
-rw-r--r-- | app/models/public_body_category_link.rb | 15 | ||||
-rw-r--r-- | app/models/public_body_heading.rb | 7 |
4 files changed, 80 insertions, 7 deletions
diff --git a/app/controllers/admin_public_body_category_controller.rb b/app/controllers/admin_public_body_category_controller.rb index 221d8e4ad..f814763ad 100644 --- a/app/controllers/admin_public_body_category_controller.rb +++ b/app/controllers/admin_public_body_category_controller.rb @@ -26,10 +26,27 @@ class AdminPublicBodyCategoryController < AdminController else if params[:headings] heading_ids = params[:headings].values + removed_headings = @category.public_body_heading_ids - heading_ids + added_headings = heading_ids - @category.public_body_heading_ids + + unless removed_headings.empty? + # remove the link objects + deleted_links = PublicBodyCategoryLink.where( + :public_body_category_id => @category.id, + :public_body_heading_id => [removed_headings] + ) + deleted_links.delete_all + + #fix the category object + @category.public_body_heading_ids = heading_ids + end + + added_headings.each do |heading_id| + @category.add_to_heading(PublicBodyHeading.find(heading_id)) + end end if @category.update_attributes(params[:public_body_category]) - @category.public_body_heading_ids = heading_ids flash[:notice] = 'Category was successfully updated.' end end diff --git a/app/models/public_body_category.rb b/app/models/public_body_category.rb index cb15f67e6..24b3c89b4 100644 --- a/app/models/public_body_category.rb +++ b/app/models/public_body_category.rb @@ -6,14 +6,17 @@ # title :text not null # category_tag :text not null # description :text not null +# display_order :integer # require 'forwardable' class PublicBodyCategory < ActiveRecord::Base - attr_accessible :locale, :category_tag, :title, :description, :translated_versions + attr_accessible :locale, :category_tag, :title, :description, + :translated_versions, :display_order - has_and_belongs_to_many :public_body_headings + has_many :public_body_category_links + has_many :public_body_headings, :through => :public_body_category_links translates :title, :description validates_uniqueness_of :category_tag, :message => N_('Tag is already taken') @@ -46,7 +49,7 @@ class PublicBodyCategory < ActiveRecord::Base sql = %Q| SELECT * FROM public_body_categories pbc WHERE pbc.id NOT IN ( SELECT public_body_category_id AS id - FROM public_body_categories_public_body_headings + FROM public_body_category_links ) | PublicBodyCategory.find_by_sql(sql) end @@ -54,6 +57,7 @@ class PublicBodyCategory < ActiveRecord::Base # Called from the data files themselves def self.add(locale, categories) @heading = nil + @heading_order = 0 categories.each do |category| if category.is_a?(Array) #categories @@ -75,13 +79,15 @@ class PublicBodyCategory < ActiveRecord::Base pb_category.save end end - pb_category.public_body_headings << @heading + + pb_category.add_to_heading(@heading) else I18n.with_locale(locale) do pb_category.title = category[1] pb_category.description = category[2] pb_category.save end + pb_category.add_to_heading(@heading) end else #headings @@ -94,13 +100,43 @@ class PublicBodyCategory < ActiveRecord::Base end else I18n.with_locale(locale) do - @heading = PublicBodyHeading.create(:name => category) + last_heading = PublicBodyHeading.last + if last_heading + @heading_order = last_heading.display_order + 1 + else + @heading_order = 1 + end + @heading = PublicBodyHeading.create(:name => category, :display_order => @heading_order) end end end end end + def add_to_heading(heading) + if self.public_body_headings.include?(heading) + # we already have this, stop + return + end + + # find the last display_order for this heading + last_link = PublicBodyCategoryLink.where( + :public_body_heading_id => heading.id + ).order(:category_display_order).last + + if last_link + display_order = last_link.category_display_order + 1 + else + display_order = 1 + end + + heading_link = PublicBodyCategoryLink.create( + :public_body_category_id => self.id, + :public_body_heading_id => heading.id, + :category_display_order => display_order + ) + end + # Convenience methods for creating/editing translations via forms def find_translation_by_locale(locale) self.translations.find_by_locale(locale) diff --git a/app/models/public_body_category_link.rb b/app/models/public_body_category_link.rb new file mode 100644 index 000000000..bd4fe541a --- /dev/null +++ b/app/models/public_body_category_link.rb @@ -0,0 +1,15 @@ +# == Schema Information +# +# Table name: public_body_category_link +# +# public_body_category_id :integer not null +# public_body_heading_id :integer not null +# category_display_order :integer +# + +class PublicBodyCategoryLink < ActiveRecord::Base + attr_accessible :public_body_category_id, :public_body_heading_id, :category_display_order + + belongs_to :public_body_category + belongs_to :public_body_heading +end
\ No newline at end of file diff --git a/app/models/public_body_heading.rb b/app/models/public_body_heading.rb index 6c7d645da..818940341 100644 --- a/app/models/public_body_heading.rb +++ b/app/models/public_body_heading.rb @@ -4,10 +4,15 @@ # # id :integer not null, primary key # name :text not null +# display_order :integer # class PublicBodyHeading < ActiveRecord::Base - has_and_belongs_to_many :public_body_categories + attr_accessible :name, :display_order, :translated_versions + + has_many :public_body_category_links + has_many :public_body_categories, :order => :category_display_order, :through => :public_body_category_links + default_scope order('display_order ASC') translates :name |