Commit 4004a064b440aae7dffca0a7444641d75f609c4b
1 parent
1260d03e
Exists in
master
and in
29 other branches
ActionItem70: recalculating paths
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@526 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
2 changed files
with
35 additions
and
0 deletions
Show diff stats
app/models/category.rb
@@ -23,7 +23,14 @@ class Category < ActiveRecord::Base | @@ -23,7 +23,14 @@ class Category < ActiveRecord::Base | ||
23 | self.find(:all, :conditions => ['parent_id is null and environment_id = ?', environment.id ]) | 23 | self.find(:all, :conditions => ['parent_id is null and environment_id = ?', environment.id ]) |
24 | end | 24 | end |
25 | 25 | ||
26 | + # used to know when to trigger batch renaming | ||
27 | + attr_accessor :recalculate_path | ||
28 | + | ||
26 | def name=(value) | 29 | def name=(value) |
30 | + if self.name != value | ||
31 | + self.recalculate_path = true | ||
32 | + end | ||
33 | + | ||
27 | self[:name] = value | 34 | self[:name] = value |
28 | unless self.name.blank? | 35 | unless self.name.blank? |
29 | self.slug = self.name.transliterate.downcase.gsub( /[^-a-z0-9~\s\.:;+=_]/, '').gsub(/[\s\.:;=_+]+/, '-').gsub(/[\-]{2,}/, '-').to_s | 36 | self.slug = self.name.transliterate.downcase.gsub( /[^-a-z0-9~\s\.:;+=_]/, '').gsub(/[\s\.:;=_+]+/, '-').gsub(/[\-]{2,}/, '-').to_s |
@@ -46,10 +53,24 @@ class Category < ActiveRecord::Base | @@ -46,10 +53,24 @@ class Category < ActiveRecord::Base | ||
46 | end | 53 | end |
47 | end | 54 | end |
48 | 55 | ||
56 | + # calculate the right path | ||
49 | before_create do |cat| | 57 | before_create do |cat| |
50 | if cat.path == cat.slug && (! cat.top_level?) | 58 | if cat.path == cat.slug && (! cat.top_level?) |
51 | cat.path = cat.calculate_path | 59 | cat.path = cat.calculate_path |
52 | end | 60 | end |
53 | end | 61 | end |
54 | 62 | ||
63 | + # when renaming a category, all children categories must have their paths | ||
64 | + # recalculated | ||
65 | + after_update do |cat| | ||
66 | + if cat.recalculate_path | ||
67 | + cat.children.each do |item| | ||
68 | + item.path = item.calculate_path | ||
69 | + item.recalculate_path = true | ||
70 | + item.save! | ||
71 | + end | ||
72 | + end | ||
73 | + cat.recalculate_path = false | ||
74 | + end | ||
75 | + | ||
55 | end | 76 | end |
test/unit/category_test.rb
@@ -137,4 +137,18 @@ class CategoryTest < Test::Unit::TestCase | @@ -137,4 +137,18 @@ class CategoryTest < Test::Unit::TestCase | ||
137 | 137 | ||
138 | end | 138 | end |
139 | 139 | ||
140 | + def test_renaming_a_category_should_change_path_of_children | ||
141 | + c1 = Category.create!(:name => 'parent', :environment_id => @env.id) | ||
142 | + c2 = Category.create!(:name => 'child', :environment_id => @env.id, :parent_id => c1.id) | ||
143 | + c3 = Category.create!(:name => 'grandchild', :environment_id => @env.id, :parent_id => c2.id) | ||
144 | + | ||
145 | + c1.name = 'parent new name' | ||
146 | + c1.save! | ||
147 | + | ||
148 | + assert_equal 'parent-new-name', c1.path | ||
149 | + assert_equal 'parent-new-name/child', Category.find(c2.id).path | ||
150 | + assert_equal 'parent-new-name/child/grandchild', Category.find(c3.id).path | ||
151 | + | ||
152 | + end | ||
153 | + | ||
140 | end | 154 | end |