caboose-cms 0.7.61 → 0.7.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/caboose/block_types_controller.rb +8 -0
- data/app/controllers/caboose/pages_controller.rb +40 -2
- data/app/models/caboose/authenticator.rb +7 -2
- data/app/models/caboose/block.rb +34 -2
- data/app/models/caboose/media.rb +28 -0
- data/app/models/caboose/page.rb +49 -0
- data/app/models/caboose/page_custom_field.rb +16 -0
- data/app/models/caboose/page_custom_field_value.rb +11 -0
- data/app/models/caboose/role.rb +35 -0
- data/app/models/caboose/schema.rb +25 -7
- data/app/models/caboose/user.rb +4 -0
- data/app/views/caboose/pages/_admin_header.html.erb +2 -1
- data/app/views/caboose/pages/admin_duplicate_form.html.erb +159 -0
- data/config/routes.rb +2 -0
- data/lib/caboose/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c272bf371f2238c10f223ed9646be6b720abc489
|
4
|
+
data.tar.gz: fc2f1856b64f891dd3276a518bc40e3ce657605e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de227bf0058a89347d1cfa7a500f0f418097087d60517e751f25b16da3865c3c707ad3ebe284d8472e0adea868e37082458a6271189b41b20db65bbaa1f80635
|
7
|
+
data.tar.gz: 2008b41b44cf266719f907e071402b4b10f42f5ffe6679b34af3081f74408e1d096425bb6d9879b47ac770e62ec3c1e72d85c77b39a3012b449cf5a3aae03155
|
@@ -191,6 +191,14 @@ module Caboose
|
|
191
191
|
BlockType.where("parent_id is null or parent_id = 0").reorder(:name).all.each do |bt|
|
192
192
|
admin_tree_options_helper(options, bt, '')
|
193
193
|
end
|
194
|
+
when 'layout'
|
195
|
+
options = []
|
196
|
+
cat_ids = BlockTypeCategory.layouts.collect{ |cat| cat.id }
|
197
|
+
q = ["block_type_category_id in (?)", cat_ids]
|
198
|
+
q = ["block_type_category_id in (?) and block_type_site_memberships.site_id = ?", cat_ids, params[:site_id]] if params[:site_id]
|
199
|
+
BlockType.includes(:block_type_site_memberships).where(q).reorder(:description).all.each do |bt|
|
200
|
+
options << { 'value' => bt.id, 'text' => bt.description }
|
201
|
+
end
|
194
202
|
end
|
195
203
|
render :json => options
|
196
204
|
end
|
@@ -472,6 +472,37 @@ module Caboose
|
|
472
472
|
resp.success = save && page.save
|
473
473
|
render json: resp
|
474
474
|
end
|
475
|
+
|
476
|
+
# GET /admin/pages/:page_id/duplicate
|
477
|
+
def admin_duplicate_form
|
478
|
+
return unless user_is_allowed('pages', 'add')
|
479
|
+
@page = Page.find(params[:id])
|
480
|
+
render :layout => 'caboose/admin'
|
481
|
+
end
|
482
|
+
|
483
|
+
# POST /admin/pages/:page_id/duplicate
|
484
|
+
def admin_duplicate
|
485
|
+
return unless user_is_allowed('pages', 'add')
|
486
|
+
|
487
|
+
resp = Caboose::StdClass.new
|
488
|
+
|
489
|
+
p = Page.where(:id => params[:id]).first
|
490
|
+
site_id = params[:site_id]
|
491
|
+
parent_id = params[:parent_id]
|
492
|
+
block_type_id = params[:block_type_id]
|
493
|
+
child_block_type_id = params[:child_block_type_id]
|
494
|
+
duplicate_children = params[:duplicate_children] ? true : false
|
495
|
+
|
496
|
+
if p.nil? then resp.error = "Invalid page"
|
497
|
+
elsif site_id.nil? then resp.error = "Invalid site"
|
498
|
+
elsif parent_id.nil? then resp.error = "Invalid parent"
|
499
|
+
else
|
500
|
+
resp.new_id = p.duplicate(site_id, parent_id, duplicate_children, block_type_id, child_block_type_id)
|
501
|
+
resp.success = true
|
502
|
+
end
|
503
|
+
|
504
|
+
render :json => resp
|
505
|
+
end
|
475
506
|
|
476
507
|
# GET /admin/pages/:page_id/delete
|
477
508
|
def admin_delete_form
|
@@ -502,9 +533,16 @@ module Caboose
|
|
502
533
|
# GET /admin/pages/sitemap-options
|
503
534
|
def admin_sitemap_options
|
504
535
|
parent_id = params[:parent_id]
|
505
|
-
p =
|
536
|
+
p = nil
|
537
|
+
if params[:site_id] && @site.is_master && user_is_allowed('admin', 'admin')
|
538
|
+
p = parent_id ? Page.find(parent_id) : Page.index_page(params[:site_id].to_i)
|
539
|
+
else
|
540
|
+
p = parent_id ? Page.find(parent_id) : Page.index_page(@site.id)
|
541
|
+
end
|
506
542
|
options = []
|
507
|
-
|
543
|
+
if p
|
544
|
+
sitemap_helper(p, options)
|
545
|
+
end
|
508
546
|
render :json => options
|
509
547
|
end
|
510
548
|
|
@@ -6,8 +6,13 @@ module Caboose
|
|
6
6
|
resp = StdClass.new
|
7
7
|
pass = Digest::SHA1.hexdigest(Caboose::salt + password)
|
8
8
|
|
9
|
-
user =
|
10
|
-
|
9
|
+
user = nil
|
10
|
+
if username == 'superadmin'
|
11
|
+
user = User.where(:username => username).first
|
12
|
+
else
|
13
|
+
user = User.where(:username => username, :site_id => site.id).first
|
14
|
+
user = User.where(:email => username, :site_id => site.id).first if user.nil?
|
15
|
+
end
|
11
16
|
|
12
17
|
ll = LoginLog.new
|
13
18
|
ll.username = username
|
data/app/models/caboose/block.rb
CHANGED
@@ -28,12 +28,13 @@ class Caboose::Block < ActiveRecord::Base
|
|
28
28
|
:page_id,
|
29
29
|
:parent_id,
|
30
30
|
:block_type_id,
|
31
|
+
:media_id,
|
31
32
|
:sort_order,
|
32
33
|
:constrain,
|
33
34
|
:full_width,
|
34
35
|
:name,
|
35
|
-
:value
|
36
|
-
|
36
|
+
:value
|
37
|
+
|
37
38
|
after_initialize :caste_value
|
38
39
|
before_save :caste_value
|
39
40
|
|
@@ -548,6 +549,37 @@ class Caboose::Block < ActiveRecord::Base
|
|
548
549
|
end
|
549
550
|
|
550
551
|
end
|
552
|
+
|
553
|
+
# Assumes that we start the duplicate process at the top level block
|
554
|
+
def duplicate_page_block(site_id, page_id, new_block_type_id = nil, new_parent_id = nil)
|
555
|
+
m = self.media_id ? self.media.duplicate(site_id) : nil
|
556
|
+
b = Caboose::Block.create(
|
557
|
+
:page_id => page_id,
|
558
|
+
:post_id => nil,
|
559
|
+
:parent_id => new_parent_id,
|
560
|
+
:media_id => self.media_id ? m.id : nil,
|
561
|
+
:block_type_id => new_block_type_id,
|
562
|
+
:sort_order => self.sort_order,
|
563
|
+
:constrain => self.constrain,
|
564
|
+
:full_width => self.full_width,
|
565
|
+
:name => self.name,
|
566
|
+
:value => self.value
|
567
|
+
)
|
568
|
+
self.children.each do |b2|
|
569
|
+
if b2.name
|
570
|
+
# The block is part of the block type, so we have to find the corresponding child block in the new block type
|
571
|
+
bt = Caboose::BlockType.where(:parent_id => new_block_type_id, :name => b2.name).first
|
572
|
+
if bt
|
573
|
+
b2.duplicate_page_block(site_id, page_id, bt.id, b.id)
|
574
|
+
else
|
575
|
+
# Don't duplicate it because the corresponding child block doesn't exist in the new block type
|
576
|
+
end
|
577
|
+
else
|
578
|
+
# The block is a child block that isn't part of the block type definition
|
579
|
+
b2.duplicate_page_block(site_id, page_id, b2.block_type_id, b.id)
|
580
|
+
end
|
581
|
+
end
|
582
|
+
end
|
551
583
|
|
552
584
|
|
553
585
|
end
|
data/app/models/caboose/media.rb
CHANGED
@@ -80,6 +80,12 @@ class Caboose::Media < ActiveRecord::Base
|
|
80
80
|
self.save
|
81
81
|
end
|
82
82
|
|
83
|
+
def download_file_from_url(url)
|
84
|
+
self.image = URI.parse(url)
|
85
|
+
self.processed = true
|
86
|
+
self.save
|
87
|
+
end
|
88
|
+
|
83
89
|
def api_hash
|
84
90
|
{
|
85
91
|
:id => self.id,
|
@@ -123,5 +129,27 @@ class Caboose::Media < ActiveRecord::Base
|
|
123
129
|
def reprocess_image
|
124
130
|
self.image.reprocess!
|
125
131
|
end
|
132
|
+
|
133
|
+
def duplicate(site_id)
|
134
|
+
cat = Caboose::MediaCategory.top_category(site_id)
|
135
|
+
m = Caboose::Media.create(
|
136
|
+
:media_category_id => cat.id ,
|
137
|
+
:name => self.name ,
|
138
|
+
:description => self.description ,
|
139
|
+
:original_name => self.original_name ,
|
140
|
+
:image_file_name => self.image_file_name ,
|
141
|
+
:image_content_type => self.image_content_type ,
|
142
|
+
:image_file_size => self.image_file_size ,
|
143
|
+
:image_updated_at => self.image_updated_at ,
|
144
|
+
:file_file_name => self.file_file_name ,
|
145
|
+
:file_content_type => self.file_content_type ,
|
146
|
+
:file_file_size => self.file_file_size ,
|
147
|
+
:file_updated_at => self.file_updated_at ,
|
148
|
+
:processed => false
|
149
|
+
)
|
150
|
+
m.delay.download_image_from_url(self.image.url(:original)) if self.image
|
151
|
+
m.delay.download_file_from_url(self.file.url) if self.file
|
152
|
+
return m
|
153
|
+
end
|
126
154
|
|
127
155
|
end
|
data/app/models/caboose/page.rb
CHANGED
@@ -388,5 +388,54 @@ class Caboose::Page < ActiveRecord::Base
|
|
388
388
|
Caboose::PageCustomFieldValue.create(:page_id => self.id, :page_custom_field_id => f.id, :key => f.key, :value => f.default_value, :sort_order => f.sort_order) if fv.nil?
|
389
389
|
end
|
390
390
|
end
|
391
|
+
|
392
|
+
def duplicate(site_id, parent_id, duplicate_children = false, block_type_id = nil, child_block_type_id = nil)
|
393
|
+
p = Caboose::Page.create(
|
394
|
+
:site_id => site_id ,
|
395
|
+
:parent_id => parent_id ,
|
396
|
+
:title => self.title ,
|
397
|
+
:menu_title => self.menu_title ,
|
398
|
+
:slug => self.slug ,
|
399
|
+
:alias => self.alias ,
|
400
|
+
:uri => self.uri ,
|
401
|
+
:redirect_url => self.redirect_url ,
|
402
|
+
:hide => self.hide ,
|
403
|
+
:content_format => self.content_format ,
|
404
|
+
:custom_css => self.custom_css ,
|
405
|
+
:custom_js => self.custom_js ,
|
406
|
+
:linked_resources => self.linked_resources ,
|
407
|
+
:layout => self.layout ,
|
408
|
+
:sort_order => self.sort_order ,
|
409
|
+
:custom_sort_children => self.custom_sort_children ,
|
410
|
+
:seo_title => self.seo_title ,
|
411
|
+
:meta_keywords => self.meta_keywords ,
|
412
|
+
:meta_description => self.meta_description ,
|
413
|
+
:meta_robots => self.meta_robots ,
|
414
|
+
:canonical_url => self.canonical_url ,
|
415
|
+
:fb_description => self.fb_description ,
|
416
|
+
:gp_description => self.gp_description
|
417
|
+
)
|
418
|
+
|
419
|
+
self.page_tags.each{ |tag| Caboose::PageTag.create(:page_id => p.id, :tag => tag.tag) }
|
420
|
+
|
421
|
+
self.page_custom_field_values.each do |v|
|
422
|
+
f = v.page_custom_field.duplicate(site_id)
|
423
|
+
v.duplicate(p.id, f.id)
|
424
|
+
end
|
425
|
+
|
426
|
+
self.page_permissions.each do |pp|
|
427
|
+
pp.role.duplicate(site_id)
|
428
|
+
r = Caboose::Role.where(:site_id => site_id, :name => pp.role.name).first
|
429
|
+
Caboose::PagePermission.create(:page_id => p.id, :role_id => r.id, :action => pp.action)
|
430
|
+
end
|
391
431
|
|
432
|
+
self.block.duplicate_page_block(site_id, p.id, block_type_id)
|
433
|
+
|
434
|
+
if duplicate_children
|
435
|
+
self.children.each do |p2|
|
436
|
+
p2.duplicate(site_id, p.id, duplicate_children, child_block_type_id, child_block_type_id)
|
437
|
+
end
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
392
441
|
end
|
@@ -17,5 +17,21 @@ class Caboose::PageCustomField < ActiveRecord::Base
|
|
17
17
|
FIELD_TYPE_CHECKBOX = 'checkbox'
|
18
18
|
FIELD_TYPE_DATE = 'date'
|
19
19
|
FIELD_TYPE_DATETIME = 'datetime'
|
20
|
+
|
21
|
+
def duplicate(site_id)
|
22
|
+
f = Caboose::PageCustomField.where(:site_id => site_id, :key => self.key).first
|
23
|
+
if f.nil?
|
24
|
+
f = Caboose::PageCustomField.create(
|
25
|
+
:site_id => site_id ,
|
26
|
+
:key => self.key ,
|
27
|
+
:name => self.name ,
|
28
|
+
:field_type => self.field_type ,
|
29
|
+
:default_value => self.default_value ,
|
30
|
+
:options => self.options ,
|
31
|
+
:sort_order => self.sort_order
|
32
|
+
)
|
33
|
+
end
|
34
|
+
return f
|
35
|
+
end
|
20
36
|
|
21
37
|
end
|
@@ -11,4 +11,15 @@ class Caboose::PageCustomFieldValue < ActiveRecord::Base
|
|
11
11
|
:value ,
|
12
12
|
:sort_order
|
13
13
|
|
14
|
+
def duplicate(page_id, page_custom_field_id)
|
15
|
+
v = Caboose::PageCustomFieldValue.create(
|
16
|
+
:page_id => page_id,
|
17
|
+
:page_custom_field_id => pag_custom_field_id,
|
18
|
+
:key => self.key,
|
19
|
+
:value => self.value,
|
20
|
+
:sort_order => self.sort_order
|
21
|
+
)
|
22
|
+
return v
|
23
|
+
end
|
24
|
+
|
14
25
|
end
|
data/app/models/caboose/role.rb
CHANGED
@@ -108,5 +108,40 @@ class Caboose::Role < ActiveRecord::Base
|
|
108
108
|
role = Role.find(role) if role.is_a?(Integer)
|
109
109
|
return role.is_ancestor_of?(self)
|
110
110
|
end
|
111
|
+
|
112
|
+
def duplicate(site_id)
|
113
|
+
r = Caboose::Role.where(:site_id => site_id, :name => self.name).first
|
114
|
+
return if r
|
115
|
+
|
116
|
+
# If we're at the top of the role hierarchy
|
117
|
+
if self.parent_id == -1
|
118
|
+
r = Caboose::Role.create(
|
119
|
+
:site_id => site_id,
|
120
|
+
:parent_id => -1,
|
121
|
+
:name => r.name,
|
122
|
+
:description => r.description
|
123
|
+
)
|
124
|
+
self.role_permissions.each{ |rp| Caboose::RolePermission.create(:permission_id => rp.permission_id, :role_id => r.id) }
|
125
|
+
self.children.each{ |r2| r2.duplicate(site_id) }
|
126
|
+
return
|
127
|
+
end
|
128
|
+
|
129
|
+
# Otherwise, there is a parent, try to find it
|
130
|
+
new_parent = Caboose::Role.where(:site_id => site_id, :name => self.parent.name).first
|
131
|
+
if new_parent
|
132
|
+
r = Caboose::Role.create(
|
133
|
+
:site_id => site_id,
|
134
|
+
:parent_id => new_parent.id,
|
135
|
+
:name => r.name,
|
136
|
+
:description => r.description
|
137
|
+
)
|
138
|
+
self.role_permissions.each{ |rp| Caboose::RolePermission.create(:permission_id => rp.permission_id, :role_id => r.id) }
|
139
|
+
self.children.each{ |r2| r2.duplicate(site_id) }
|
140
|
+
return
|
141
|
+
end
|
142
|
+
|
143
|
+
# Since we can't find the parent, recursively duplicate the current role's parent into the new site
|
144
|
+
self.parent.duplicate(site_id)
|
145
|
+
end
|
111
146
|
|
112
147
|
end
|
@@ -869,6 +869,14 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
869
869
|
|
870
870
|
#c.change_column :store_variants, :taxable, :boolean
|
871
871
|
|
872
|
+
super_admin_user = nil
|
873
|
+
if !Caboose::User.exists?(:username => 'superadmin')
|
874
|
+
super_admin_user = Caboose::User.create(:first_name => 'Super', :last_name => 'Admin', :username => 'superadmin', :email => 'superadmin@nine.is')
|
875
|
+
super_admin_user.password = Digest::SHA1.hexdigest(Caboose::salt + 'caboose')
|
876
|
+
super_admin_user.save
|
877
|
+
end
|
878
|
+
super_admin_user = Caboose::User.where(:username => 'superadmin').first if super_admin_user.nil?
|
879
|
+
|
872
880
|
admin_user = nil
|
873
881
|
if !Caboose::User.exists?(:username => 'admin')
|
874
882
|
admin_user = Caboose::User.create(:first_name => 'Admin', :last_name => 'User', :username => 'admin', :email => 'william@nine.is')
|
@@ -881,16 +889,19 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
881
889
|
Caboose::User.create(:id => Caboose::User::LOGGED_OUT_USER_ID, :first_name => 'Logged', :last_name => 'Out', :username => 'elo', :email => 'elo@nine.is')
|
882
890
|
end
|
883
891
|
|
892
|
+
Caboose::Role.create(:parent_id => -1 , :name => 'Super Admin' ) if !Caboose::Role.exists?(:name => 'Super Admin' )
|
893
|
+
super_admin_role = Caboose::Role.where(:name => 'Super Admin' ).first
|
884
894
|
Caboose::Role.create(:parent_id => -1 , :name => 'Admin' ) if !Caboose::Role.exists?(:name => 'Admin' )
|
885
|
-
admin_role
|
895
|
+
admin_role = Caboose::Role.where(:name => 'Admin' ).first
|
886
896
|
Caboose::Role.create(:parent_id => -1 , :name => 'Everyone Logged Out' ) if !Caboose::Role.exists?(:name => 'Everyone Logged Out' )
|
887
|
-
elo_role
|
897
|
+
elo_role = Caboose::Role.where(:name => 'Everyone Logged Out' ).first
|
888
898
|
Caboose::Role.create(:parent_id => elo_role.id , :name => 'Everyone Logged In' ) if !Caboose::Role.exists?(:name => 'Everyone Logged In' )
|
889
|
-
eli_role
|
899
|
+
eli_role = Caboose::Role.where(:name => 'Everyone Logged In' ).first
|
890
900
|
|
891
901
|
Caboose::User.create(:first_name => 'John', :last_name => 'Doe', :username => 'elo', :email => 'william@nine.is') if !Caboose::User.exists?(:username => 'elo')
|
892
902
|
elo_user = Caboose::User.where(:username => 'elo').first
|
893
|
-
|
903
|
+
|
904
|
+
Caboose::Permission.create(:resource => 'all' , :action => 'super' ) if !Caboose::Permission.exists?(:resource => 'all' , :action => 'super' )
|
894
905
|
Caboose::Permission.create(:resource => 'all' , :action => 'all' ) if !Caboose::Permission.exists?(:resource => 'all' , :action => 'all' )
|
895
906
|
Caboose::Permission.create(:resource => 'users' , :action => 'view' ) if !Caboose::Permission.exists?(:resource => 'users' , :action => 'view' )
|
896
907
|
Caboose::Permission.create(:resource => 'users' , :action => 'edit' ) if !Caboose::Permission.exists?(:resource => 'users' , :action => 'edit' )
|
@@ -904,6 +915,9 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
904
915
|
Caboose::Permission.create(:resource => 'permissions' , :action => 'edit' ) if !Caboose::Permission.exists?(:resource => 'permissions' , :action => 'edit' )
|
905
916
|
Caboose::Permission.create(:resource => 'permissions' , :action => 'delete' ) if !Caboose::Permission.exists?(:resource => 'permissions' , :action => 'delete' )
|
906
917
|
Caboose::Permission.create(:resource => 'permissions' , :action => 'add' ) if !Caboose::Permission.exists?(:resource => 'permissions' , :action => 'add' )
|
918
|
+
|
919
|
+
# Add the super admin user to the super admin role
|
920
|
+
Caboose::RoleMembership.create(:user_id => super_admin_user.id, :role_id => super_admin_role.id) if !Caboose::RoleMembership.exists?(:user_id => super_admin_user.id, :role_id => super_admin_role.id)
|
907
921
|
|
908
922
|
# Add the admin user to the admin role
|
909
923
|
Caboose::RoleMembership.create(:user_id => admin_user.id, :role_id => admin_role.id) if !Caboose::RoleMembership.exists?(:user_id => admin_user.id, :role_id => admin_role.id)
|
@@ -911,9 +925,14 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
911
925
|
# Add the elo to the elo role
|
912
926
|
Caboose::RoleMembership.create(:user_id => elo_user.id, :role_id => elo_role.id) if !Caboose::RoleMembership.exists?(:user_id => elo_user.id, :role_id => elo_role.id)
|
913
927
|
|
914
|
-
# Add the all/
|
928
|
+
# Add the all/super permission to the super admin role
|
929
|
+
super_admin_perm = Caboose::Permission.where(:resource => 'all', :action => 'super').first
|
930
|
+
Caboose::RolePermission.create(:role_id => super_admin_role.id, :permission_id => super_admin_perm.id) if !Caboose::RolePermission.exists?(:role_id => super_admin_role.id, :permission_id => super_admin_perm.id)
|
931
|
+
|
932
|
+
# Add the all/all permission to the admin role and super admin role
|
915
933
|
admin_perm = Caboose::Permission.where(:resource => 'all', :action => 'all').first
|
916
|
-
Caboose::RolePermission.create(:role_id => admin_role.id, :permission_id => admin_perm.id) if !Caboose::RolePermission.exists?(:role_id => admin_role.id, :permission_id => admin_perm.id)
|
934
|
+
Caboose::RolePermission.create(:role_id => admin_role.id , :permission_id => admin_perm.id) if !Caboose::RolePermission.exists?(:role_id => admin_role.id , :permission_id => admin_perm.id)
|
935
|
+
Caboose::RolePermission.create(:role_id => super_admin_role.id , :permission_id => admin_perm.id) if !Caboose::RolePermission.exists?(:role_id => super_admin_role.id , :permission_id => admin_perm.id)
|
917
936
|
|
918
937
|
# Create the necessary pages
|
919
938
|
Caboose::Page.create(:title => 'Home' , :parent_id => -1, :hide => 0, :layout => 'home', :uri => '') if !Caboose::Page.exists?(:title => 'Home')
|
@@ -1022,6 +1041,5 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
1022
1041
|
if Caboose::ShippingMethod.all.count == 0
|
1023
1042
|
Caboose::ShippingMethodLoader.load_shipping_methods
|
1024
1043
|
end
|
1025
|
-
|
1026
1044
|
end
|
1027
1045
|
end
|
data/app/models/caboose/user.rb
CHANGED
@@ -38,6 +38,10 @@ class Caboose::User < ActiveRecord::Base
|
|
38
38
|
return self.id == Caboose::User.logged_out_user_id(self.site_id)
|
39
39
|
end
|
40
40
|
|
41
|
+
def is_super_admin?
|
42
|
+
return self.username == 'superadmin'
|
43
|
+
end
|
44
|
+
|
41
45
|
def is_allowed(resource, action)
|
42
46
|
elo = Caboose::Role.logged_out_role(self.site_id)
|
43
47
|
elo_is_allowed = elo.is_allowed(resource, action)
|
@@ -41,7 +41,8 @@ tabs = {
|
|
41
41
|
'Custom CSS' => "/admin/pages/#{@page.id}/css",
|
42
42
|
'Custom JS' => "/admin/pages/#{@page.id}/js",
|
43
43
|
'SEO' => "/admin/pages/#{@page.id}/seo",
|
44
|
-
'Sitemap' => "/admin/pages/#{@page.id}/sitemap",
|
44
|
+
'Sitemap' => "/admin/pages/#{@page.id}/sitemap",
|
45
|
+
'Duplicate Page' => "/admin/pages/#{@page.id}/duplicate",
|
45
46
|
'Delete Page' => "/admin/pages/#{@page.id}/delete"
|
46
47
|
}
|
47
48
|
|
@@ -0,0 +1,159 @@
|
|
1
|
+
|
2
|
+
<%= render :partial => 'caboose/pages/admin_header' %>
|
3
|
+
|
4
|
+
<div id='message'></div>
|
5
|
+
|
6
|
+
<%= render :partial => 'caboose/pages/admin_footer' %>
|
7
|
+
<% content_for :caboose_js do %>
|
8
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
9
|
+
<script type="text/javascript">
|
10
|
+
|
11
|
+
$(document).ready(function() {
|
12
|
+
duplicate_page();
|
13
|
+
});
|
14
|
+
|
15
|
+
var site = false;
|
16
|
+
var parent = false;
|
17
|
+
var block_type = false;
|
18
|
+
var duplicate_children = false;
|
19
|
+
|
20
|
+
function duplicate_page(site, parent, block_type, duplicate_children, child_block_type)
|
21
|
+
{
|
22
|
+
<% if @logged_in_user.is_super_admin? %>
|
23
|
+
if (!site)
|
24
|
+
{
|
25
|
+
sites = false;
|
26
|
+
$.ajax({
|
27
|
+
url: '/admin/sites/options',
|
28
|
+
type: 'get',
|
29
|
+
success: function(resp) { sites = resp; },
|
30
|
+
async: false
|
31
|
+
});
|
32
|
+
var select = $('<select/>').change(function() {
|
33
|
+
var so = $(this).find('option:selected');
|
34
|
+
duplicate_page({ id: so.val(), name: so.html() });
|
35
|
+
});
|
36
|
+
select.append($('<option/>').html("-- Select a site --"));
|
37
|
+
$.each(sites, function(i, s) { select.append($('<option/>').val(s.value).html(s.text)); });
|
38
|
+
$('#message').empty().append($('<p/>').addClass('note')
|
39
|
+
.append("Select a site into which the new page will go.<br /><br />")
|
40
|
+
.append(select)
|
41
|
+
);
|
42
|
+
return;
|
43
|
+
}
|
44
|
+
<% else %>
|
45
|
+
site = { id: <%= @site.id %>, name: <%= raw Caboose.json(@site.name) %> };
|
46
|
+
<% end %>
|
47
|
+
if (!parent)
|
48
|
+
{
|
49
|
+
pages = false;
|
50
|
+
$.ajax({
|
51
|
+
url: '/admin/pages/sitemap-options?site_id=' + site.id,
|
52
|
+
type: 'get',
|
53
|
+
success: function(resp) { pages = resp; },
|
54
|
+
async: false
|
55
|
+
});
|
56
|
+
var select = $('<select/>').change(function() {
|
57
|
+
var so = $(this).find('option:selected');
|
58
|
+
duplicate_page(site, { id: so.val(), title: so.html() });
|
59
|
+
});
|
60
|
+
select.append($('<option/>').html("-- Select a parent page --"));
|
61
|
+
$.each(pages, function(i, p) { select.append($('<option/>').val(p.value).html(p.text)); });
|
62
|
+
$('#message').empty().append($('<p/>').addClass('note')
|
63
|
+
<% if @logged_in_user.is_super_admin? %>.append("You are duplicating this page into the \"" + site.name + "\" site.<br />")<% end %>
|
64
|
+
.append("Select a parent for the new page.<br /><br />")
|
65
|
+
.append(select).append('<br /><br />')
|
66
|
+
.append($('<input/>').attr('type', 'button').val('< Back').click(function() { duplicate_page(); }))
|
67
|
+
);
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
if (!block_type)
|
71
|
+
{
|
72
|
+
block_types = false;
|
73
|
+
$.ajax({
|
74
|
+
url: '/admin/block-types/layout-options?site_id=' + site.id,
|
75
|
+
type: 'get',
|
76
|
+
success: function(resp) { block_types = resp; },
|
77
|
+
async: false
|
78
|
+
});
|
79
|
+
var select = $('<select/>').change(function() {
|
80
|
+
var so = $(this).find('option:selected');
|
81
|
+
duplicate_page(site, parent, { id: so.val(), name: so.html() });
|
82
|
+
});
|
83
|
+
select.append($('<option/>').html("-- Select a block type --"));
|
84
|
+
$.each(block_types, function(i, bt) { select.append($('<option/>').val(bt.value).html(bt.text)); });
|
85
|
+
$('#message').empty().append($('<p/>').addClass('note')
|
86
|
+
<% if @logged_in_user.is_super_admin? %>
|
87
|
+
.append("You are duplicating this page into the \"" + site.name + "\" site under the \"" + parent.title + "\" page.<br />")
|
88
|
+
<% else %>
|
89
|
+
.append("You are duplicating this page under the \"" + parent.title + "\" page.<br />")
|
90
|
+
<% end %>
|
91
|
+
.append("Select a new layout for the new page.<br /><br />")
|
92
|
+
.append(select).append('<br /><br />')
|
93
|
+
.append($('<input/>').attr('type', 'button').val('< Back').click(function() { duplicate_page(site); }))
|
94
|
+
);
|
95
|
+
return;
|
96
|
+
}
|
97
|
+
if (typeof duplicate_children == 'undefined')
|
98
|
+
{
|
99
|
+
$('#message').empty().append($('<p/>').addClass('note')
|
100
|
+
<% if @logged_in_user.is_super_admin? %>
|
101
|
+
.append("You are duplicating this page into the \"" + site.name + "\" site under the \"" + parent.title + "\" page using the \"" + block_type.name + "\" layout.<br />")
|
102
|
+
<% else %>
|
103
|
+
.append("You are duplicating this page under the \"" + parent.title + "\" page using the \"" + block_type.name + "\" layout.<br />")
|
104
|
+
<% end %>
|
105
|
+
.append("Do you want to duplicate this page's children?<br /><br />")
|
106
|
+
.append($('<input/>').attr('type', 'button').val('Yes').click(function() { duplicate_page(site, parent, block_type, true ); })).append(' ')
|
107
|
+
.append($('<input/>').attr('type', 'button').val('No' ).click(function() { duplicate_page(site, parent, block_type, false ); })).append('<br /><br />')
|
108
|
+
.append($('<input/>').attr('type', 'button').val('< Back').click(function() { duplicate_page(site, parent); }))
|
109
|
+
);
|
110
|
+
return;
|
111
|
+
}
|
112
|
+
if (duplicate_children && !child_block_type)
|
113
|
+
{
|
114
|
+
block_types = false;
|
115
|
+
$.ajax({
|
116
|
+
url: '/admin/block-types/layout-options?site_id=' + site.id,
|
117
|
+
type: 'get',
|
118
|
+
success: function(resp) { block_types = resp; },
|
119
|
+
async: false
|
120
|
+
});
|
121
|
+
var select = $('<select/>').change(function() {
|
122
|
+
var so = $(this).find('option:selected');
|
123
|
+
duplicate_page(site, parent, block_type, duplicate_children, { id: so.val(), name: so.html() });
|
124
|
+
});
|
125
|
+
select.append($('<option/>').html("-- Select a block type --"));
|
126
|
+
$.each(block_types, function(i, bt) { select.append($('<option/>').val(bt.value).html(bt.text)); });
|
127
|
+
$('#message').empty().append($('<p/>').addClass('note')
|
128
|
+
<% if @logged_in_user.is_super_admin? %>
|
129
|
+
.append("You are duplicating this page into the \"" + site.name + "\" site under the \"" + parent.title + "\" page using the \"" + block_type.name + "\" layout.<br />")
|
130
|
+
<% else %>
|
131
|
+
.append("You are duplicating this page under the \"" + parent.title + "\" page using the \"" + block_type.name + "\" layout.<br />")
|
132
|
+
<% end %>
|
133
|
+
.append("Since you have chosen to duplicate child pages, please select the layout for those new child pages:<br /><br />")
|
134
|
+
.append(select).append('<br /><br />')
|
135
|
+
.append($('<input/>').attr('type', 'button').val('< Back').click(function() { duplicate_page(site, parent, block_type); }))
|
136
|
+
);
|
137
|
+
return;
|
138
|
+
}
|
139
|
+
|
140
|
+
$('#message').html("<p class='loading'>Duplicating page...</p>");
|
141
|
+
$.ajax({
|
142
|
+
url: '/admin/pages/<%= @page.id %>/duplicate',
|
143
|
+
type: 'post',
|
144
|
+
data: {
|
145
|
+
site_id: site.id,
|
146
|
+
parent_id: parent.id,
|
147
|
+
block_type_id: block_type.id,
|
148
|
+
duplicate_children: duplicate_children,
|
149
|
+
child_block_type_id: (typeof child_block_type == 'undefined' ? null : child_block_type.id)
|
150
|
+
},
|
151
|
+
success: function(resp) {
|
152
|
+
if (resp.error) $('#message').html("<p class='note error'>" + resp.error + "</p>");
|
153
|
+
if (resp.success) $('#message').html("<p class='note success'>The page has been successfully duplicated.</p>");
|
154
|
+
}
|
155
|
+
});
|
156
|
+
}
|
157
|
+
|
158
|
+
</script>
|
159
|
+
<% end %>
|
data/config/routes.rb
CHANGED
@@ -271,6 +271,8 @@ Caboose::Engine.routes.draw do
|
|
271
271
|
get "/admin/pages/new" => "pages#admin_new"
|
272
272
|
get "/admin/pages/:id/block-options" => "pages#admin_block_options"
|
273
273
|
get "/admin/pages/:id/uri" => "pages#admin_page_uri"
|
274
|
+
get "/admin/pages/:id/duplicate" => "pages#admin_duplicate_form"
|
275
|
+
post "/admin/pages/:id/duplicate" => "pages#admin_duplicate"
|
274
276
|
get "/admin/pages/:id/delete" => "pages#admin_delete_form"
|
275
277
|
get "/admin/pages/:id/sitemap" => "pages#admin_sitemap"
|
276
278
|
get "/admin/pages/:id/custom-fields" => "pages#admin_edit_custom_fields"
|
data/lib/caboose/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caboose-cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.62
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -1030,6 +1030,7 @@ files:
|
|
1030
1030
|
- app/views/caboose/pages/_content.html.erb
|
1031
1031
|
- app/views/caboose/pages/_new_block_header.html.erb
|
1032
1032
|
- app/views/caboose/pages/admin_delete_form.html.erb
|
1033
|
+
- app/views/caboose/pages/admin_duplicate_form.html.erb
|
1033
1034
|
- app/views/caboose/pages/admin_edit_child_sort_order.html.erb
|
1034
1035
|
- app/views/caboose/pages/admin_edit_content.html.erb
|
1035
1036
|
- app/views/caboose/pages/admin_edit_css.html.erb
|