Commit 4f8868c25720895890b8c4572446719c941c0d98
1 parent
28dd8dad
Exists in
master
and in
23 other branches
ActionIntem858: Generic Profile Template Usage
* adding method to apply templates * added setting[:templates_id] in environment * adding methods and vies to set and edit templates
Showing
8 changed files
with
274 additions
and
8 deletions
Show diff stats
app/controllers/admin/admin_panel_controller.rb
| @@ -16,7 +16,22 @@ class AdminPanelController < AdminController | @@ -16,7 +16,22 @@ class AdminPanelController < AdminController | ||
| 16 | end | 16 | end |
| 17 | end | 17 | end |
| 18 | 18 | ||
| 19 | - def edit_templates | 19 | + def manage_templates |
| 20 | + @person_templates = environment.templates('person') | ||
| 21 | + @community_templates = environment.templates('community') | ||
| 22 | + @enterprise_templates = environment.templates('enterprise') | ||
| 23 | + @templates = @person_templates + @community_templates + @enterprise_templates | ||
| 20 | end | 24 | end |
| 21 | 25 | ||
| 26 | + def set_template | ||
| 27 | + environment.person_template = Person.find(params[:environment][:person_template]) if params[:environment][:person_template] | ||
| 28 | + environment.enterprise_template = Enterprise.find(params[:environment][:enterprise_template]) if params[:environment][:enterprise_template] | ||
| 29 | + environment.community_template = Community.find(params[:environment][:community_template]) if params[:environment][:community_template] | ||
| 30 | + if environment.save! | ||
| 31 | + flash[:notice] = _('Template updated successfully') | ||
| 32 | + else | ||
| 33 | + flash[:error] = _('Could not update template') | ||
| 34 | + end | ||
| 35 | + redirect_to :action => 'manage_templates' | ||
| 36 | + end | ||
| 22 | end | 37 | end |
app/models/environment.rb
| @@ -335,18 +335,57 @@ class Environment < ActiveRecord::Base | @@ -335,18 +335,57 @@ class Environment < ActiveRecord::Base | ||
| 335 | settings[:layout_template] = value | 335 | settings[:layout_template] = value |
| 336 | end | 336 | end |
| 337 | 337 | ||
| 338 | - def enterprise_template | ||
| 339 | - Enterprise.find_by_id settings[:enterprise_template_id] | ||
| 340 | - end | ||
| 341 | - | ||
| 342 | def community_template | 338 | def community_template |
| 343 | Community.find_by_id settings[:community_template_id] | 339 | Community.find_by_id settings[:community_template_id] |
| 344 | end | 340 | end |
| 345 | 341 | ||
| 342 | + def community_template=(value) | ||
| 343 | + settings[:community_template_id] = value.id | ||
| 344 | + end | ||
| 345 | + | ||
| 346 | def person_template | 346 | def person_template |
| 347 | Person.find_by_id settings[:person_template_id] | 347 | Person.find_by_id settings[:person_template_id] |
| 348 | end | 348 | end |
| 349 | 349 | ||
| 350 | + def person_template=(value) | ||
| 351 | + settings[:person_template_id] = value.id | ||
| 352 | + end | ||
| 353 | + | ||
| 354 | + def enterprise_template | ||
| 355 | + Enterprise.find_by_id settings[:enterprise_template_id] | ||
| 356 | + end | ||
| 357 | + | ||
| 358 | + def enterprise_template=(value) | ||
| 359 | + settings[:enterprise_template_id] = value.id | ||
| 360 | + end | ||
| 361 | + | ||
| 362 | + def inactive_enterprise_template | ||
| 363 | + Enterprise.find_by_id settings[:inactive_enterprise_template_id] | ||
| 364 | + end | ||
| 365 | + | ||
| 366 | + def inactive_enterprise_template=(value) | ||
| 367 | + settings[:inactive_enterprise_template_id] = value.id | ||
| 368 | + end | ||
| 369 | + | ||
| 370 | + def templates(profile = 'profile') | ||
| 371 | + klass = profile.classify.constantize | ||
| 372 | + templates = [] | ||
| 373 | + if settings[:templates_ids] | ||
| 374 | + settings[:templates_ids].each do |template_id| | ||
| 375 | + templates << klass.find_by_id(template_id) | ||
| 376 | + end | ||
| 377 | + end | ||
| 378 | + templates.compact | ||
| 379 | + end | ||
| 380 | + | ||
| 381 | + def add_templates=(values) | ||
| 382 | + if settings[:templates_ids] | ||
| 383 | + settings[:templates_ids].concat(values.map(&:id)) | ||
| 384 | + else | ||
| 385 | + settings[:templates_ids] = values.map(&:id) | ||
| 386 | + end | ||
| 387 | + end | ||
| 388 | + | ||
| 350 | after_create :create_templates | 389 | after_create :create_templates |
| 351 | 390 | ||
| 352 | def create_templates | 391 | def create_templates |
app/models/profile.rb
| @@ -213,6 +213,12 @@ class Profile < ActiveRecord::Base | @@ -213,6 +213,12 @@ class Profile < ActiveRecord::Base | ||
| 213 | nil | 213 | nil |
| 214 | end | 214 | end |
| 215 | 215 | ||
| 216 | + def apply_template(template) | ||
| 217 | + copy_blocks_from(template) | ||
| 218 | + copy_articles_from(template) | ||
| 219 | + self.update_attributes!(:custom_footer => template[:custom_footer], :custom_header => template[:custom_header]) | ||
| 220 | + end | ||
| 221 | + | ||
| 216 | xss_terminate :only => [ :name, :nickname, :address, :contact_phone ] | 222 | xss_terminate :only => [ :name, :nickname, :address, :contact_phone ] |
| 217 | 223 | ||
| 218 | # returns the contact email for this profile. By default returns the the | 224 | # returns the contact email for this profile. By default returns the the |
| @@ -355,6 +361,16 @@ class Profile < ActiveRecord::Base | @@ -355,6 +361,16 @@ class Profile < ActiveRecord::Base | ||
| 355 | end | 361 | end |
| 356 | 362 | ||
| 357 | def copy_article_tree(article, parent=nil) | 363 | def copy_article_tree(article, parent=nil) |
| 364 | + original_article = self.articles.find_by_name(article.name) | ||
| 365 | + if original_article | ||
| 366 | + num = 2 | ||
| 367 | + new_name = original_article.name + ' ' + num.to_s | ||
| 368 | + while self.articles.find_by_name(new_name) | ||
| 369 | + num = num + 1 | ||
| 370 | + new_name = original_article.name + ' ' + num.to_s | ||
| 371 | + end | ||
| 372 | + original_article.update_attributes!(:name => new_name) | ||
| 373 | + end | ||
| 358 | article_copy = article.copy(:profile => self, :parent => parent, :advertise => false) | 374 | article_copy = article.copy(:profile => self, :parent => parent, :advertise => false) |
| 359 | if article.profile.home_page == article | 375 | if article.profile.home_page == article |
| 360 | self.home_page = article_copy | 376 | self.home_page = article_copy |
| @@ -440,11 +456,26 @@ class Profile < ActiveRecord::Base | @@ -440,11 +456,26 @@ class Profile < ActiveRecord::Base | ||
| 440 | end | 456 | end |
| 441 | 457 | ||
| 442 | def custom_header | 458 | def custom_header |
| 443 | - self[:custom_header] || environment.custom_header | 459 | + header = self[:custom_header] || environment.custom_header |
| 460 | + if header | ||
| 461 | + if self.respond_to?(:name) && header.include?('{name}') | ||
| 462 | + header.gsub('{name}', self.name) | ||
| 463 | + else | ||
| 464 | + header | ||
| 465 | + end | ||
| 466 | + end | ||
| 444 | end | 467 | end |
| 445 | 468 | ||
| 446 | def custom_footer | 469 | def custom_footer |
| 447 | - self[:custom_footer] || environment.custom_footer | 470 | + footer = self[:custom_footer] || environment.custom_footer |
| 471 | + if footer | ||
| 472 | + %w[contact_person contact_email contact_phone location address economic_activity].each do |att| | ||
| 473 | + if self.respond_to?(att) && footer.include?("{#{att}}") | ||
| 474 | + footer.gsub!("{#{att}}", self.send(att).to_s) | ||
| 475 | + end | ||
| 476 | + end | ||
| 477 | + end | ||
| 478 | + footer | ||
| 448 | end | 479 | end |
| 449 | 480 | ||
| 450 | def theme | 481 | def theme |
app/views/admin_panel/index.rhtml
| @@ -10,5 +10,5 @@ | @@ -10,5 +10,5 @@ | ||
| 10 | <li><%= link_to _('Manage Categories'), :controller => 'categories'%></li> | 10 | <li><%= link_to _('Manage Categories'), :controller => 'categories'%></li> |
| 11 | <li><%= link_to _('Manage User roles'), :controller => 'role' %></li> | 11 | <li><%= link_to _('Manage User roles'), :controller => 'role' %></li> |
| 12 | <li><%= link_to _('Manage Validators by region'), :controller => 'region_validators' %></li> | 12 | <li><%= link_to _('Manage Validators by region'), :controller => 'region_validators' %></li> |
| 13 | - <li><%= link_to _('Edit Templates'), :action => 'edit_templates' %></li> | 13 | + <li><%= link_to _('Manage Templates'), :action => 'manage_templates' %></li> |
| 14 | </ul> | 14 | </ul> |
| @@ -0,0 +1,39 @@ | @@ -0,0 +1,39 @@ | ||
| 1 | +<h1><%= _('Set Templates') %></h1> | ||
| 2 | + | ||
| 3 | +<% labelled_form_for(:environment, @environment, :url => {:action => 'set_template'}) do |f| %> | ||
| 4 | +<%= current_user.name %> | ||
| 5 | + <p> | ||
| 6 | + <label for='environment_person_template'><%= _('Person Template') %></label><br/> | ||
| 7 | + <%= f.select :person_template, @person_templates.map {|item| [ item.identifier, item.id]}, :selected => (environment.person_template.nil? ? nil : environment.person_template.id) %> | ||
| 8 | + </p> | ||
| 9 | + | ||
| 10 | + <p> | ||
| 11 | + <label for='environment_community_template'><%= _('Community Template') %></label><br/> | ||
| 12 | + <%= f.select :community_template, @community_templates.map {|item| [ item.identifier, item.id]}, :selected => (environment.community_template.nil? ? nil : environment.community_template.id) %> | ||
| 13 | + </p> | ||
| 14 | + | ||
| 15 | + <p> | ||
| 16 | + <label for='environment_enterprise_template'><%= _('Enterprise Template') %></label><br/> | ||
| 17 | + <%= f.select :enterprise_template, @enterprise_templates.map {|item| [ item.identifier, item.id]}, :selected => (environment.enterprise_template.nil? ? nil : environment.enterprise_template.id) %> | ||
| 18 | + </p> | ||
| 19 | + | ||
| 20 | + <p> | ||
| 21 | + <label for='environment_inactive_enterprise_template'><%= _('Inactive Enterprise Template') %></label><br/> | ||
| 22 | + <%= f.select :inactive_enterprise_template, @enterprise_templates.map {|item| [ item.identifier, item.id]}, :selected => (environment.inactive_enterprise_template.nil? ? nil : environment.inactive_enterprise_template.id) %> | ||
| 23 | + </p> | ||
| 24 | + | ||
| 25 | + <% button_bar do %> | ||
| 26 | + <%= submit_button(:save, _('Save')) %> | ||
| 27 | + <%= button(:cancel, _('Cancel'), :action => 'index') %> | ||
| 28 | + <% end %> | ||
| 29 | + | ||
| 30 | +<% end %> | ||
| 31 | + | ||
| 32 | +<h1><%= _('Edit Templates') %></h1> | ||
| 33 | + | ||
| 34 | +<ul> | ||
| 35 | +<% @templates.each do |template| %> | ||
| 36 | + <li><%= link_to template.identifier, :controller => 'profile_editor', :profile => template.identifier %></li> | ||
| 37 | +<% end %> | ||
| 38 | +</ul> | ||
| 39 | + |
test/functional/admin_panel_controller_test.rb
| @@ -110,4 +110,39 @@ class AdminPanelControllerTest < Test::Unit::TestCase | @@ -110,4 +110,39 @@ class AdminPanelControllerTest < Test::Unit::TestCase | ||
| 110 | assert_equal "This <strong>is</strong> my new environment", Environment.default.message_for_disabled_enterprise | 110 | assert_equal "This <strong>is</strong> my new environment", Environment.default.message_for_disabled_enterprise |
| 111 | end | 111 | end |
| 112 | 112 | ||
| 113 | + should 'list templates' do | ||
| 114 | + get :manage_templates | ||
| 115 | + | ||
| 116 | + assert_kind_of Array, assigns(:person_templates) | ||
| 117 | + assert_kind_of Array, assigns(:community_templates) | ||
| 118 | + assert_kind_of Array, assigns(:enterprise_templates) | ||
| 119 | + end | ||
| 120 | + | ||
| 121 | + should 'display environment template options' do | ||
| 122 | + e = Environment.default | ||
| 123 | + @controller.stubs(:environment).returns(e) | ||
| 124 | + profile_template = Profile.create!(:name =>'template_test', :identifier => 'template_test', :environment => e) | ||
| 125 | + e.settings[:templates_ids] = [profile_template.id] | ||
| 126 | + e.save! | ||
| 127 | + e.stubs(:templates).with('person').returns([profile_template]) | ||
| 128 | + e.stubs(:templates).with('community').returns([profile_template]) | ||
| 129 | + e.stubs(:templates).with('enterprise').returns([profile_template]) | ||
| 130 | + | ||
| 131 | + assert_equal [profile_template], e.templates('person') | ||
| 132 | + | ||
| 133 | + get :manage_templates | ||
| 134 | + ['person_template', 'community_template', 'enterprise_template'].each do |template| | ||
| 135 | + assert_tag :tag => 'select', :attributes => { :id => "environment_#{template}"}, :descendant => { :tag => 'option', :content => 'template_test'} | ||
| 136 | + end | ||
| 137 | + end | ||
| 138 | + | ||
| 139 | + should 'set template' do | ||
| 140 | + e = Environment.default | ||
| 141 | + @controller.stubs(:environment).returns(e) | ||
| 142 | + profile_template = Enterprise.create!(:name =>'template_test', :identifier => 'template_test') | ||
| 143 | + | ||
| 144 | + post :set_template, :environment => {:enterprise_template => profile_template.id} | ||
| 145 | + | ||
| 146 | + assert_equal profile_template, e.enterprise_template | ||
| 147 | + end | ||
| 113 | end | 148 | end |
test/unit/environment_test.rb
| @@ -440,6 +440,58 @@ class EnvironmentTest < Test::Unit::TestCase | @@ -440,6 +440,58 @@ class EnvironmentTest < Test::Unit::TestCase | ||
| 440 | assert !e.person_template.public? | 440 | assert !e.person_template.public? |
| 441 | end | 441 | end |
| 442 | 442 | ||
| 443 | + should 'set a template in community_template' do | ||
| 444 | + e = Environment.create!(:name => 'test_env') | ||
| 445 | + template = Community.create!(:name => 'Community template 2', :identifier => e.name.to_slug + 'community_template_2', :environment => e, :public_profile => false) | ||
| 446 | + e.community_template = template | ||
| 447 | + | ||
| 448 | + assert_equal template, e.community_template | ||
| 449 | + end | ||
| 450 | + | ||
| 451 | + should 'set a template in person_template' do | ||
| 452 | + e = Environment.create!(:name => 'test_env') | ||
| 453 | + template = create_user('person_template_2').person | ||
| 454 | + e.person_template = template | ||
| 455 | + | ||
| 456 | + assert_equal template, e.person_template | ||
| 457 | + end | ||
| 458 | + | ||
| 459 | + should 'set a template in enterprise_template' do | ||
| 460 | + e = Environment.create!(:name => 'test_env') | ||
| 461 | + template = Enterprise.create!(:name => 'Enterprise template 2', :identifier => e.name.to_slug + 'enterprise_template', :environment => e, :public_profile => false) | ||
| 462 | + e.enterprise_template = template | ||
| 463 | + | ||
| 464 | + assert_equal template, e.enterprise_template | ||
| 465 | + end | ||
| 466 | + | ||
| 467 | + should 'add templates when it is empty' do | ||
| 468 | + e = Environment.create!(:name => 'test_env') | ||
| 469 | + ent_template_a = Enterprise.create!(:name => 'Enterprise template A', :identifier => e.name.to_slug + 'enterprise_template_a', :environment => e, :public_profile => false) | ||
| 470 | + ent_template_b = Enterprise.create!(:name => 'Enterprise template B', :identifier => e.name.to_slug + 'enterprise_template_b', :environment => e, :public_profile => false) | ||
| 471 | + | ||
| 472 | + e.add_templates = [ent_template_a, ent_template_b] | ||
| 473 | + assert_equal [ent_template_a, ent_template_b], e.templates | ||
| 474 | + end | ||
| 475 | + | ||
| 476 | + should 'add templates when it is not empty' do | ||
| 477 | + e = Environment.create!(:name => 'test_env') | ||
| 478 | + | ||
| 479 | + ent_template_example = Enterprise.create!(:name => 'Enterprise template example', :identifier => e.name.to_slug + 'enterprise_template_example', :environment => e, :public_profile => false) | ||
| 480 | + | ||
| 481 | + e.settings[:templates_ids] = [ent_template_example.id] | ||
| 482 | + e.save | ||
| 483 | + | ||
| 484 | + ent_template_a = Enterprise.create!(:name => 'Enterprise template A', :identifier => e.name.to_slug + 'enterprise_template_a', :environment => e, :public_profile => false) | ||
| 485 | + | ||
| 486 | + e.add_templates = [ent_template_a] | ||
| 487 | + | ||
| 488 | + assert_equal [ent_template_example, ent_template_a], e.templates | ||
| 489 | + end | ||
| 490 | + | ||
| 491 | + should 'have an empty array of templates by default' do | ||
| 492 | + assert_equal [], Environment.new.templates | ||
| 493 | + end | ||
| 494 | + | ||
| 443 | should 'not disable ssl by default' do | 495 | should 'not disable ssl by default' do |
| 444 | e = Environment.new | 496 | e = Environment.new |
| 445 | assert !e.disable_ssl | 497 | assert !e.disable_ssl |
test/unit/profile_test.rb
| @@ -767,10 +767,18 @@ class ProfileTest < Test::Unit::TestCase | @@ -767,10 +767,18 @@ class ProfileTest < Test::Unit::TestCase | ||
| 767 | assert_equal 'my custom header', Profile.new(:custom_header => 'my custom header').custom_header | 767 | assert_equal 'my custom header', Profile.new(:custom_header => 'my custom header').custom_header |
| 768 | end | 768 | end |
| 769 | 769 | ||
| 770 | + should 'provide custom header with variables' do | ||
| 771 | + assert_equal 'Custom header of Test', Profile.new(:custom_header => 'Custom header of {name}', :name => 'Test').custom_header | ||
| 772 | + end | ||
| 773 | + | ||
| 770 | should 'provide custom footer' do | 774 | should 'provide custom footer' do |
| 771 | assert_equal 'my custom footer', Profile.new(:custom_footer => 'my custom footer').custom_footer | 775 | assert_equal 'my custom footer', Profile.new(:custom_footer => 'my custom footer').custom_footer |
| 772 | end | 776 | end |
| 773 | 777 | ||
| 778 | + should 'provide custom footer with variables' do | ||
| 779 | + assert_equal 'Address: Address for test', Profile.new(:custom_footer => 'Address: {address}', :address => 'Address for test').custom_footer | ||
| 780 | + end | ||
| 781 | + | ||
| 774 | should 'provide environment header if profile header is blank' do | 782 | should 'provide environment header if profile header is blank' do |
| 775 | profile = Profile.new | 783 | profile = Profile.new |
| 776 | env = mock | 784 | env = mock |
| @@ -893,6 +901,53 @@ class ProfileTest < Test::Unit::TestCase | @@ -893,6 +901,53 @@ class ProfileTest < Test::Unit::TestCase | ||
| 893 | assert_equal 1, p.boxes[0].blocks.size | 901 | assert_equal 1, p.boxes[0].blocks.size |
| 894 | end | 902 | end |
| 895 | 903 | ||
| 904 | + should 'apply template' do | ||
| 905 | + template = Profile.create!(:name => 'test template', :identifier => 'test_template') | ||
| 906 | + template.boxes.destroy_all | ||
| 907 | + template.boxes << Box.new | ||
| 908 | + template.boxes[0].blocks << Block.new | ||
| 909 | + template.save! | ||
| 910 | + | ||
| 911 | + p = Profile.create!(:name => 'test prof', :identifier => 'test_prof') | ||
| 912 | + | ||
| 913 | + p.apply_template(template) | ||
| 914 | + | ||
| 915 | + assert_equal 1, p.boxes.size | ||
| 916 | + assert_equal 1, p.boxes[0].blocks.size | ||
| 917 | + end | ||
| 918 | + | ||
| 919 | + should 'copy articles when applying template' do | ||
| 920 | + template = Profile.create!(:name => 'test template', :identifier => 'test_template') | ||
| 921 | + template.boxes.destroy_all | ||
| 922 | + template.boxes << Box.new | ||
| 923 | + template.boxes[0].blocks << Block.new | ||
| 924 | + template.articles.create(:name => 'template article') | ||
| 925 | + template.save! | ||
| 926 | + | ||
| 927 | + p = Profile.create!(:name => 'test prof', :identifier => 'test_prof') | ||
| 928 | + | ||
| 929 | + p.apply_template(template) | ||
| 930 | + | ||
| 931 | + assert_not_nil p.articles.find_by_name('template article') | ||
| 932 | + end | ||
| 933 | + | ||
| 934 | + should 'rename existing articles when applying template' do | ||
| 935 | + template = Profile.create!(:name => 'test template', :identifier => 'test_template') | ||
| 936 | + template.boxes.destroy_all | ||
| 937 | + template.boxes << Box.new | ||
| 938 | + template.boxes[0].blocks << Block.new | ||
| 939 | + template.articles.create(:name => 'some article') | ||
| 940 | + template.save! | ||
| 941 | + | ||
| 942 | + p = Profile.create!(:name => 'test prof', :identifier => 'test_prof') | ||
| 943 | + p.articles.create(:name => 'some article') | ||
| 944 | + | ||
| 945 | + p.apply_template(template) | ||
| 946 | + | ||
| 947 | + assert_not_nil p.articles.find_by_name('some article 2') | ||
| 948 | + assert_not_nil p.articles.find_by_name('some article') | ||
| 949 | + end | ||
| 950 | + | ||
| 896 | TMP_THEMES_DIR = RAILS_ROOT + '/test/tmp/profile_themes' | 951 | TMP_THEMES_DIR = RAILS_ROOT + '/test/tmp/profile_themes' |
| 897 | should 'have themes' do | 952 | should 'have themes' do |
| 898 | Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | 953 | Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) |