Commit 4f8868c25720895890b8c4572446719c941c0d98
1 parent
28dd8dad
Exists in
master
and in
22 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 | 16 | end |
| 17 | 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 | 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 | 37 | end | ... | ... |
app/models/environment.rb
| ... | ... | @@ -335,18 +335,57 @@ class Environment < ActiveRecord::Base |
| 335 | 335 | settings[:layout_template] = value |
| 336 | 336 | end |
| 337 | 337 | |
| 338 | - def enterprise_template | |
| 339 | - Enterprise.find_by_id settings[:enterprise_template_id] | |
| 340 | - end | |
| 341 | - | |
| 342 | 338 | def community_template |
| 343 | 339 | Community.find_by_id settings[:community_template_id] |
| 344 | 340 | end |
| 345 | 341 | |
| 342 | + def community_template=(value) | |
| 343 | + settings[:community_template_id] = value.id | |
| 344 | + end | |
| 345 | + | |
| 346 | 346 | def person_template |
| 347 | 347 | Person.find_by_id settings[:person_template_id] |
| 348 | 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 | 389 | after_create :create_templates |
| 351 | 390 | |
| 352 | 391 | def create_templates | ... | ... |
app/models/profile.rb
| ... | ... | @@ -213,6 +213,12 @@ class Profile < ActiveRecord::Base |
| 213 | 213 | nil |
| 214 | 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 | 222 | xss_terminate :only => [ :name, :nickname, :address, :contact_phone ] |
| 217 | 223 | |
| 218 | 224 | # returns the contact email for this profile. By default returns the the |
| ... | ... | @@ -355,6 +361,16 @@ class Profile < ActiveRecord::Base |
| 355 | 361 | end |
| 356 | 362 | |
| 357 | 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 | 374 | article_copy = article.copy(:profile => self, :parent => parent, :advertise => false) |
| 359 | 375 | if article.profile.home_page == article |
| 360 | 376 | self.home_page = article_copy |
| ... | ... | @@ -440,11 +456,26 @@ class Profile < ActiveRecord::Base |
| 440 | 456 | end |
| 441 | 457 | |
| 442 | 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 | 467 | end |
| 445 | 468 | |
| 446 | 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 | 479 | end |
| 449 | 480 | |
| 450 | 481 | def theme | ... | ... |
app/views/admin_panel/index.rhtml
| ... | ... | @@ -10,5 +10,5 @@ |
| 10 | 10 | <li><%= link_to _('Manage Categories'), :controller => 'categories'%></li> |
| 11 | 11 | <li><%= link_to _('Manage User roles'), :controller => 'role' %></li> |
| 12 | 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 | 14 | </ul> | ... | ... |
| ... | ... | @@ -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 | 110 | assert_equal "This <strong>is</strong> my new environment", Environment.default.message_for_disabled_enterprise |
| 111 | 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 | 148 | end | ... | ... |
test/unit/environment_test.rb
| ... | ... | @@ -440,6 +440,58 @@ class EnvironmentTest < Test::Unit::TestCase |
| 440 | 440 | assert !e.person_template.public? |
| 441 | 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 | 495 | should 'not disable ssl by default' do |
| 444 | 496 | e = Environment.new |
| 445 | 497 | assert !e.disable_ssl | ... | ... |
test/unit/profile_test.rb
| ... | ... | @@ -767,10 +767,18 @@ class ProfileTest < Test::Unit::TestCase |
| 767 | 767 | assert_equal 'my custom header', Profile.new(:custom_header => 'my custom header').custom_header |
| 768 | 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 | 774 | should 'provide custom footer' do |
| 771 | 775 | assert_equal 'my custom footer', Profile.new(:custom_footer => 'my custom footer').custom_footer |
| 772 | 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 | 782 | should 'provide environment header if profile header is blank' do |
| 775 | 783 | profile = Profile.new |
| 776 | 784 | env = mock |
| ... | ... | @@ -893,6 +901,53 @@ class ProfileTest < Test::Unit::TestCase |
| 893 | 901 | assert_equal 1, p.boxes[0].blocks.size |
| 894 | 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 | 951 | TMP_THEMES_DIR = RAILS_ROOT + '/test/tmp/profile_themes' |
| 897 | 952 | should 'have themes' do |
| 898 | 953 | Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ... | ... |