knitkit 2.1.15 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/app/controllers/knitkit/base_controller.rb +1 -1
- data/app/controllers/knitkit/comments_controller.rb +7 -2
- data/app/controllers/knitkit/erp_app/desktop/app_controller.rb +78 -98
- data/app/controllers/knitkit/erp_app/desktop/articles_controller.rb +65 -45
- data/app/controllers/knitkit/erp_app/desktop/content_controller.rb +22 -12
- data/app/controllers/knitkit/erp_app/desktop/file_assets_controller.rb +1 -1
- data/app/controllers/knitkit/erp_app/desktop/image_assets_controller.rb +28 -16
- data/app/controllers/knitkit/erp_app/desktop/inquiries_controller.rb +15 -49
- data/app/controllers/knitkit/erp_app/desktop/online_document_sections_controller.rb +4 -3
- data/app/controllers/knitkit/erp_app/desktop/position_controller.rb +69 -11
- data/app/controllers/knitkit/erp_app/desktop/theme_controller.rb +63 -60
- data/app/controllers/knitkit/erp_app/desktop/website_controller.rb +98 -82
- data/app/controllers/knitkit/erp_app/desktop/website_host_controller.rb +77 -0
- data/app/controllers/knitkit/erp_app/desktop/website_nav_controller.rb +64 -44
- data/app/controllers/knitkit/erp_app/desktop/website_nav_item_controller.rb +147 -0
- data/app/controllers/knitkit/erp_app/desktop/website_section_controller.rb +81 -45
- data/app/controllers/knitkit/mobile_controller.rb +15 -0
- data/app/controllers/knitkit/online_document_sections_controller.rb +2 -1
- data/app/controllers/knitkit/unauthorized_controller.rb +0 -1
- data/app/controllers/knitkit/website_sections_controller.rb +7 -4
- data/app/mailers/website_inquiry_mailer.rb +8 -7
- data/app/models/content.rb +11 -2
- data/app/models/document.rb +2 -17
- data/app/models/published_website.rb +96 -59
- data/app/models/theme.rb +100 -14
- data/app/models/website.rb +260 -28
- data/app/models/website_inquiry.rb +5 -12
- data/app/models/website_section.rb +9 -1
- data/app/views/knitkit/blogs/_add_comment.html.erb +44 -23
- data/app/views/knitkit/blogs/_comment.html.erb +4 -6
- data/app/views/knitkit/blogs/index.html.erb +63 -49
- data/app/views/knitkit/blogs/show.html.erb +17 -12
- data/app/views/knitkit/mobile/index.html.erb +162 -0
- data/app/views/knitkit/online_document_sections/index.html.erb +7 -5
- data/app/views/knitkit/unauthorized/index.html.erb +8 -4
- data/app/views/knitkit/website_sections/index.html.erb +8 -4
- data/app/views/layouts/knitkit/base.html.erb +79 -63
- data/app/views/layouts/knitkit/online_document_sections.html.erb +74 -52
- data/app/views/menus/knitkit/_default_menu.html.erb +4 -4
- data/app/views/menus/knitkit/_default_section_menu.html.erb +22 -23
- data/app/views/shared/knitkit/_bread_crumb.html.erb +10 -7
- data/app/views/shared/knitkit/_footer.html.erb +2 -2
- data/app/views/website_inquiry_mailer/inquiry.erb +23 -2
- data/app/widgets/contact_us/base.rb +25 -50
- data/app/widgets/contact_us/javascript/contact_us.js +7 -7
- data/app/widgets/contact_us/views/error.html.erb +6 -8
- data/app/widgets/contact_us/views/index.html.erb +28 -1
- data/app/widgets/contact_us/views/layouts/base.html.erb +9 -6
- data/app/widgets/contact_us/views/success.html.erb +3 -3
- data/app/widgets/google_map/views/index.html.erb +36 -36
- data/app/widgets/login/base.rb +1 -0
- data/app/widgets/login/javascript/login.js +3 -3
- data/app/widgets/login/views/index.html.erb +46 -26
- data/app/widgets/login/views/layouts/base.html.erb +15 -13
- data/app/widgets/login/views/login_header.html.erb +7 -9
- data/app/widgets/manage_profile/base.rb +116 -164
- data/app/widgets/manage_profile/views/_address.html.erb +184 -0
- data/app/widgets/manage_profile/views/_contact_information_form.html.erb +23 -192
- data/app/widgets/manage_profile/views/_email_address.html.erb +163 -0
- data/app/widgets/manage_profile/views/_password_form.html.erb +23 -20
- data/app/widgets/manage_profile/views/_phone_number.html.erb +165 -0
- data/app/widgets/manage_profile/views/_user_information_form.html.erb +49 -33
- data/app/widgets/manage_profile/views/error.html.erb +6 -0
- data/app/widgets/manage_profile/views/index.html.erb +44 -46
- data/app/widgets/manage_profile/views/layouts/base.html.erb +3 -1
- data/app/widgets/manage_profile/views/success.html.erb +5 -0
- data/app/widgets/reset_password/views/index.html.erb +33 -28
- data/app/widgets/reset_password/views/layouts/base.html.erb +10 -1
- data/app/widgets/search/base.rb +37 -25
- data/app/widgets/search/views/_inline_search_form.html.erb +12 -0
- data/app/widgets/search/views/_search_form.html.erb +41 -0
- data/app/widgets/search/views/index.html.erb +5 -3
- data/app/widgets/search/views/layouts/base.html.erb +13 -23
- data/app/widgets/search/views/show.html.erb +32 -47
- data/app/widgets/signup/base.rb +1 -1
- data/app/widgets/signup/javascript/signup.js +7 -9
- data/app/widgets/signup/views/_signup_form.html.erb +34 -29
- data/app/widgets/signup/views/error.html.erb +11 -11
- data/app/widgets/signup/views/index.html.erb +3 -2
- data/app/widgets/signup/views/layouts/base.html.erb +8 -5
- data/app/widgets/signup/views/success.html.erb +5 -4
- data/config/routes.rb +39 -28
- data/db/data_migrations/20120809020508_update_website_and_configuration.rb +3 -0
- data/db/migrate/20110211002317_setup_knitkit.rb +0 -1
- data/db/migrate/20131112013052_add_knitkit_missing_indexes.rb +33 -0
- data/db/migrate/20140622212723_update_website_inquiries.rb +22 -0
- data/db/migrate/20140911185022_add_publishing_to_website.rb +5 -0
- data/db/migrate/20141013073349_add_custom_fields_to_documents.rb +12 -0
- data/db/migrate/20141016101936_upgrade_remove_dynamic_attributes.rb +13 -0
- data/lib/knitkit.rb +0 -1
- data/lib/knitkit/engine.rb +1 -0
- data/lib/knitkit/extensions.rb +4 -0
- data/lib/knitkit/extensions/active_record/acts_as_commentable.rb +33 -0
- data/lib/knitkit/extensions/active_record/acts_as_document.rb +0 -12
- data/lib/knitkit/extensions/active_record/acts_as_publishable.rb +7 -10
- data/lib/knitkit/extensions/compass_ae/widgets/base.rb +2 -4
- data/lib/knitkit/extensions/compass_ae/widgets/widget_proxy_controller.rb +4 -1
- data/lib/knitkit/extensions/railties/action_view/helpers/blog_helper.rb +16 -13
- data/lib/knitkit/extensions/railties/action_view/helpers/content_helper.rb +10 -8
- data/lib/knitkit/extensions/railties/theme_support/asset_tag_helper.rb +123 -108
- data/lib/knitkit/extensions/will_paginate/link_renderer.rb +67 -0
- data/lib/knitkit/routing_filter/section_router.rb +10 -8
- data/lib/knitkit/syntax_validator.rb +2 -2
- data/lib/knitkit/version.rb +7 -3
- data/public/images/inline_edit/close.png +0 -0
- data/public/images/knitkit/close_window.png +0 -0
- data/public/images/knitkit/logo.png +0 -0
- data/public/images/knitkit/splash/images/add-site.png +0 -0
- data/public/images/knitkit/splash/images/adjust-site.png +0 -0
- data/public/images/knitkit/splash/images/browse-site.png +0 -0
- data/public/images/knitkit/splash/images/find-themes.png +0 -0
- data/public/images/knitkit/splash/images/settings.png +0 -0
- data/public/images/knitkit/splash/images/tutorials.png +0 -0
- data/public/images/knitkit/splash/splash.png +0 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/articles_grid_panel.js +656 -627
- data/public/javascripts/erp_app/desktop/applications/knitkit/center_region.js +444 -333
- data/public/javascripts/erp_app/desktop/applications/knitkit/{east_region.js → east_region/east_region.js} +33 -33
- data/public/javascripts/erp_app/desktop/applications/knitkit/east_region/file_assets_panel.js +332 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/east_region/image_assets_data_view.js +144 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/east_region/image_assets_panel.js +335 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/{widgets_panel.js → east_region/widgets_panel.js} +55 -55
- data/public/javascripts/erp_app/desktop/applications/knitkit/inquiries_grid_panel.js +150 -37
- data/public/javascripts/erp_app/desktop/applications/knitkit/module.js +228 -96
- data/public/javascripts/erp_app/desktop/applications/knitkit/publish_window.js +89 -85
- data/public/javascripts/erp_app/desktop/applications/knitkit/published_grid_panel.js +238 -217
- data/public/javascripts/erp_app/desktop/applications/knitkit/select_roles_window.js +59 -54
- data/public/javascripts/erp_app/desktop/applications/knitkit/splash_screen.js +170 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/top_menu/main_menu.js +1168 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/top_menu/websites_combo.js +71 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/versions_grid_panel.js +301 -306
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/article.js +216 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/document.js +182 -153
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/host.js +48 -65
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/menu.js +93 -94
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/section.js +523 -197
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/website_nav_items.js +20 -34
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/hosts_tree_panel.js +74 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/menu_tree_panel.js +245 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/site_contents_tree_panel.js +360 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/themes_tree_panel.js +348 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/west_region.js +106 -1132
- data/public/javascripts/knitkit/bootstrap-datepicker.js +474 -0
- data/public/javascripts/knitkit/bootstrap.min.js +7 -0
- data/public/javascripts/knitkit/confirm-bootstrap.js +110 -0
- data/public/javascripts/knitkit/inline_editing.js +73 -50
- data/public/javascripts/knitkit/jquery.maskedinput.min.js +7 -0
- data/public/javascripts/knitkit/mobile/app/view/Main.js +108 -0
- data/public/javascripts/knitkit/mobile/ux/slidenavigation/View.js +734 -0
- data/public/javascripts/knitkit/theme.js +76 -0
- data/public/stylesheets/erp_app/desktop/applications/knitkit/knitkit.css +95 -35
- data/public/stylesheets/knitkit/bootstrap-responsive.min.css +10 -0
- data/public/stylesheets/knitkit/bootstrap.min.css +7 -0
- data/public/stylesheets/knitkit/custom.css +122 -0
- data/public/stylesheets/knitkit/datepicker.css +182 -0
- data/public/stylesheets/knitkit/inline_editing.css +58 -58
- data/spec/controllers/knitkit/erp_app/desktop/website_section_controller_spec.rb +1 -1
- data/spec/dummy/config/application.rb +1 -1
- data/spec/models/article_spec.rb +3 -3
- data/spec/models/content_spec.rb +9 -9
- data/spec/models/website_spec.rb +1 -1
- metadata +100 -114
- data/app/helpers/application_helper.rb +0 -134
- data/app/views/knitkit/articles/index.html.erb +0 -3
- data/app/views/knitkit/articles/show.html.erb +0 -4
- data/app/views/menus/knitkit/_default_sub_menu.html.erb +0 -43
- data/app/views/menus/knitkit/_default_sub_section_menu.html.erb +0 -47
- data/app/widgets/contact_us/views/_contact_form.html.erb +0 -36
- data/app/widgets/dynamic_forms/base.rb +0 -139
- data/app/widgets/dynamic_forms/javascript/dynamic_forms.js +0 -110
- data/app/widgets/dynamic_forms/views/error.html.erb +0 -5
- data/app/widgets/dynamic_forms/views/index.html.erb +0 -8
- data/app/widgets/dynamic_forms/views/success.html.erb +0 -4
- data/app/widgets/dynamic_grid/base.rb +0 -130
- data/app/widgets/dynamic_grid/helpers/controller/dynamic_grid_controller_helper.rb +0 -3
- data/app/widgets/dynamic_grid/helpers/view/dynamic_grid_view_helper.rb +0 -3
- data/app/widgets/dynamic_grid/javascript/dynamic_grid.js +0 -177
- data/app/widgets/dynamic_grid/views/index.html.erb +0 -14
- data/app/widgets/login/views/reset_password.html.erb +0 -26
- data/app/widgets/manage_profile/views/default_type_error.html.erb +0 -5
- data/app/widgets/scaffold/base.rb +0 -87
- data/app/widgets/scaffold/helpers/controller/scaffold_controller_helper.rb +0 -3
- data/app/widgets/scaffold/helpers/view/scaffold_view_helper.rb +0 -3
- data/app/widgets/scaffold/javascript/scaffold.js +0 -337
- data/app/widgets/scaffold/views/index.html.erb +0 -15
- data/app/widgets/search/views/_search.html.erb +0 -39
- data/public/images/knitkit/bullet.png +0 -0
- data/public/images/knitkit/close.png +0 -0
- data/public/images/knitkit/content.png +0 -0
- data/public/images/knitkit/footer.png +0 -0
- data/public/images/knitkit/graphic.png +0 -0
- data/public/images/knitkit/greyFadeDown.png +0 -0
- data/public/images/knitkit/link.png +0 -0
- data/public/images/knitkit/menu.png +0 -0
- data/public/images/knitkit/menu_select.png +0 -0
- data/public/images/knitkit/search.png +0 -0
- data/public/images/knitkit/tooltip.gif +0 -0
- data/public/javascripts/ajax_pagination.js +0 -33
- data/public/javascripts/datepicker.js +0 -445
- data/public/javascripts/erp_app/desktop/applications/knitkit/file_assets_panel.js +0 -341
- data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_data_view.js +0 -31
- data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_panel.js +0 -263
- data/public/javascripts/erp_app/desktop/applications/knitkit/section_articles_grid_panel.js +0 -722
- data/public/javascripts/erp_app/desktop/applications/knitkit/themes_tree_panel.js +0 -585
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/website.js +0 -155
- data/public/javascripts/knitkit/helpers.js +0 -26
- data/public/stylesheets/datepicker.css +0 -121
- data/public/stylesheets/extjs/resources/css/knitkit_extjs_4.css +0 -233
- data/public/stylesheets/knitkit/style.css +0 -426
@@ -3,7 +3,7 @@ class PublishedWebsite < ActiveRecord::Base
|
|
3
3
|
|
4
4
|
belongs_to :website
|
5
5
|
belongs_to :published_by, :class_name => "User"
|
6
|
-
has_many :published_elements, :dependent => :
|
6
|
+
has_many :published_elements, :dependent => :delete_all
|
7
7
|
|
8
8
|
def published_by_username
|
9
9
|
self.published_by.username rescue ''
|
@@ -25,91 +25,128 @@ class PublishedWebsite < ActiveRecord::Base
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def publish(comment, current_user)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
# if the site is currently being published we need to wait
|
29
|
+
# we want to sleep for 2 seconds and only try 3 times then give up
|
30
|
+
try_count = 0
|
31
|
+
while website.reload.publishing? and try_count < 2
|
32
|
+
sleep(2.seconds)
|
33
|
+
try_count += 1
|
34
|
+
end
|
35
|
+
|
36
|
+
# lock website for publishing
|
37
|
+
website.publishing = true
|
38
|
+
website.save
|
39
|
+
|
40
|
+
# wrap in transaction so if something fails it rolls back
|
41
|
+
ActiveRecord::Base.transaction do
|
42
|
+
new_publication = clone_publication(comment, current_user)
|
43
|
+
elements = []
|
44
|
+
|
45
|
+
#get a publish sections
|
46
|
+
website_sections = new_publication.website.website_sections
|
47
|
+
website_sections = website_sections | website_sections.collect { |section| section.descendants }.flatten
|
48
|
+
website_sections.each do |website_section|
|
49
|
+
#get nested elements too
|
50
|
+
website_section.self_and_descendants.each do |website_section|
|
51
|
+
if new_publication.published_elements.where('published_element_record_id = ? and (published_element_record_type = ? or published_element_record_type = ?)', website_section.id, website_section.class.to_s, website_section.class.superclass.to_s).first.nil?
|
52
|
+
published_element = PublishedElement.new
|
53
|
+
published_element.published_website = new_publication
|
54
|
+
published_element.published_element_record = website_section
|
55
|
+
published_element.version = website_section.version
|
56
|
+
published_element.published_by = current_user
|
57
|
+
published_element.save
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
if website_section.is_a?(OnlineDocumentSection)
|
62
|
+
elements = elements | [website_section.documented_item.content]
|
63
|
+
else
|
64
|
+
elements = elements | website_section.contents
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
#make sure all elements have published_element objects
|
69
|
+
elements.each do |element|
|
70
|
+
if new_publication.published_elements.where('published_element_record_id = ? and (published_element_record_type = ? or published_element_record_type = ?)', element.id, element.class.to_s, element.class.superclass.to_s).first.nil?
|
38
71
|
published_element = PublishedElement.new
|
39
72
|
published_element.published_website = new_publication
|
40
|
-
published_element.published_element_record =
|
41
|
-
published_element.version =
|
73
|
+
published_element.published_element_record = element
|
74
|
+
published_element.version = element.version
|
42
75
|
published_element.published_by = current_user
|
43
76
|
published_element.save
|
44
77
|
end
|
45
78
|
end
|
46
79
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
80
|
+
#get latest version for all elements
|
81
|
+
new_publication.published_elements.each do |published_element|
|
82
|
+
published_element.version = published_element.published_element_record.version
|
83
|
+
published_element.save
|
51
84
|
end
|
52
|
-
end
|
53
85
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
published_element = PublishedElement.new
|
58
|
-
published_element.published_website = new_publication
|
59
|
-
published_element.published_element_record = element
|
60
|
-
published_element.version = element.version
|
61
|
-
published_element.published_by = current_user
|
62
|
-
published_element.save
|
86
|
+
#check if we want to auto active this publication
|
87
|
+
if new_publication.website.auto_activate_publication?
|
88
|
+
PublishedWebsite.activate(new_publication.website, new_publication.version, current_user)
|
63
89
|
end
|
64
|
-
end
|
65
90
|
|
66
|
-
#get latest version for all elements
|
67
|
-
new_publication.published_elements.each do |published_element|
|
68
|
-
published_element.version = published_element.published_element_record.version
|
69
|
-
published_element.save
|
70
91
|
end
|
71
92
|
|
72
|
-
#
|
73
|
-
|
74
|
-
|
75
|
-
end
|
93
|
+
# unlock website for publishing
|
94
|
+
website.publishing = false
|
95
|
+
website.save
|
76
96
|
end
|
77
97
|
|
78
98
|
def publish_element(comment, element, version, current_user)
|
79
|
-
|
99
|
+
# if the site is currently being published we need to wait
|
100
|
+
# we want to sleep for 2 seconds and only try 3 times then give up
|
101
|
+
try_count = 0
|
102
|
+
while website.reload.publishing? and try_count < 2
|
103
|
+
sleep(2.seconds)
|
104
|
+
try_count += 1
|
105
|
+
end
|
80
106
|
|
81
|
-
|
107
|
+
# lock website for publishing
|
108
|
+
website.publishing = true
|
109
|
+
website.save
|
82
110
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
published_element.save
|
87
|
-
else
|
88
|
-
new_published_element = PublishedElement.new
|
89
|
-
new_published_element.published_website = new_publication
|
90
|
-
new_published_element.published_element_record = element
|
91
|
-
new_published_element.version = version
|
92
|
-
new_published_element.published_by = current_user
|
93
|
-
new_published_element.save
|
94
|
-
end
|
111
|
+
# wrap in transaction so if something fails it rolls back
|
112
|
+
ActiveRecord::Base.transaction do
|
113
|
+
new_publication = clone_publication(comment, current_user)
|
95
114
|
|
96
|
-
|
97
|
-
|
98
|
-
|
115
|
+
published_element = new_publication.published_elements.where('published_element_record_id = ? and (published_element_record_type = ? or published_element_record_type = ?)', element.id, element.class.to_s, element.class.superclass.to_s).first
|
116
|
+
|
117
|
+
unless published_element.nil?
|
118
|
+
published_element.version = version
|
119
|
+
published_element.published_by = current_user
|
120
|
+
published_element.save
|
121
|
+
else
|
122
|
+
new_published_element = PublishedElement.new
|
123
|
+
new_published_element.published_website = new_publication
|
124
|
+
new_published_element.published_element_record = element
|
125
|
+
new_published_element.version = version
|
126
|
+
new_published_element.published_by = current_user
|
127
|
+
new_published_element.save
|
128
|
+
end
|
129
|
+
|
130
|
+
#check if we want to auto active this publication
|
131
|
+
if new_publication.website.auto_activate_publication?
|
132
|
+
PublishedWebsite.activate(new_publication.website, new_publication.version, current_user)
|
133
|
+
end
|
99
134
|
end
|
135
|
+
|
136
|
+
# unlock website for publishing
|
137
|
+
website.publishing = false
|
138
|
+
website.save
|
100
139
|
end
|
101
140
|
|
102
141
|
private
|
103
142
|
|
104
|
-
def clone_publication(
|
143
|
+
def clone_publication(comment, current_user)
|
105
144
|
#create new PublishedWebsite with comment
|
106
145
|
published_website = PublishedWebsite.new
|
107
146
|
published_website.website = self.website
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
published_website.version = (self.version + version_increment).round(6)
|
112
|
-
end
|
147
|
+
|
148
|
+
published_website.version = (self.version.to_i + 1)
|
149
|
+
|
113
150
|
published_website.published_by = current_user
|
114
151
|
published_website.comment = comment
|
115
152
|
published_website.save
|
data/app/models/theme.rb
CHANGED
@@ -5,15 +5,79 @@ class Theme < ActiveRecord::Base
|
|
5
5
|
attr_protected :created_at, :updated_at
|
6
6
|
|
7
7
|
THEME_STRUCTURE = ['stylesheets', 'javascripts', 'images', 'templates']
|
8
|
-
class << self
|
8
|
+
class << self
|
9
|
+
attr_accessor :base_layouts_views_path, :knitkit_website_stylesheets_path,
|
10
|
+
:knitkit_website_images_path, :knitkit_website_javascripts_path
|
11
|
+
end
|
9
12
|
@base_layouts_views_path = "#{Knitkit::Engine.root.to_s}/app/views"
|
10
13
|
@knitkit_website_stylesheets_path = "#{Knitkit::Engine.root.to_s}/public/stylesheets/knitkit"
|
14
|
+
@knitkit_website_javascripts_path = "#{Knitkit::Engine.root.to_s}/public/javascripts/knitkit"
|
11
15
|
@knitkit_website_images_path = "#{Knitkit::Engine.root.to_s}/public/images/knitkit"
|
12
16
|
|
13
17
|
protected_with_capabilities
|
14
18
|
has_file_assets
|
15
19
|
|
20
|
+
def import_download_item_file(file)
|
21
|
+
file_support = ErpTechSvcs::FileSupport::Base.new(:storage => Rails.application.config.erp_tech_svcs.file_storage)
|
22
|
+
|
23
|
+
theme_root = Theme.find_theme_root_from_file(file)
|
24
|
+
|
25
|
+
Zip::ZipFile.open(file) do |zip|
|
26
|
+
zip.each do |entry|
|
27
|
+
if entry.name == 'about.yml'
|
28
|
+
data = ''
|
29
|
+
entry.get_input_stream { |io| data = io.read }
|
30
|
+
data = StringIO.new(data) if data.present?
|
31
|
+
about = YAML.load(data)
|
32
|
+
self.author = about['author'] if about['author']
|
33
|
+
self.version = about['version'] if about['version']
|
34
|
+
self.homepage = about['homepage'] if about['homepage']
|
35
|
+
self.summary = about['summary'] if about['summary']
|
36
|
+
else
|
37
|
+
name = entry.name.sub(/__MACOSX\//, '')
|
38
|
+
name = Theme.strip_path(name, theme_root)
|
39
|
+
data = ''
|
40
|
+
entry.get_input_stream { |io| data = io.read }
|
41
|
+
data = StringIO.new(data) if data.present?
|
42
|
+
theme_file = self.files.where("name = ? and directory = ?", File.basename(name), File.join(self.url,File.dirname(name))).first
|
43
|
+
unless theme_file.nil?
|
44
|
+
theme_file.data = data
|
45
|
+
theme_file.save
|
46
|
+
else
|
47
|
+
self.add_file(data, File.join(file_support.root, self.url,name)) rescue next
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
activate!
|
53
|
+
end
|
54
|
+
|
16
55
|
class << self
|
56
|
+
def import_download_item(tempfile, website)
|
57
|
+
name_and_id = tempfile.gsub(/(^.*(\\|\/))|(\.zip$)/, '')
|
58
|
+
theme_name = name_and_id.split('[').first
|
59
|
+
theme_id = name_and_id.split('[').last.gsub(']','')
|
60
|
+
Theme.create(:name => theme_name.sub(/-theme/, ''), :theme_id => theme_id, :website_id => website.id).tap do |theme|
|
61
|
+
theme.import_download_item_file(tempfile)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def find_theme_root_from_file(file)
|
67
|
+
theme_root = ''
|
68
|
+
Zip::ZipFile.open(file) do |zip|
|
69
|
+
zip.each do |entry|
|
70
|
+
entry.name.sub!(/__MACOSX\//, '')
|
71
|
+
if theme_root == root_in_path(entry.name)
|
72
|
+
break
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
theme_root
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
|
17
81
|
def root_dir
|
18
82
|
@@root_dir ||= "#{Rails.root}/public"
|
19
83
|
end
|
@@ -120,8 +184,6 @@ class Theme < ActiveRecord::Base
|
|
120
184
|
Zip::ZipFile.open(file.path) do |zip|
|
121
185
|
zip.each do |entry|
|
122
186
|
if entry.name == 'about.yml'
|
123
|
-
#TODO
|
124
|
-
#FIXME this does not work for some reason
|
125
187
|
data = ''
|
126
188
|
entry.get_input_stream { |io| data = io.read }
|
127
189
|
data = StringIO.new(data) if data.present?
|
@@ -146,6 +208,7 @@ class Theme < ActiveRecord::Base
|
|
146
208
|
end
|
147
209
|
end
|
148
210
|
end
|
211
|
+
|
149
212
|
end
|
150
213
|
|
151
214
|
def export
|
@@ -213,6 +276,7 @@ class Theme < ActiveRecord::Base
|
|
213
276
|
file_support = ErpTechSvcs::FileSupport::Base.new
|
214
277
|
create_theme_files_for_directory_node(file_support.build_tree(Theme.base_layouts_views_path, :preload => true), :templates, :path_to_replace => Theme.base_layouts_views_path)
|
215
278
|
create_theme_files_for_directory_node(file_support.build_tree(Theme.knitkit_website_stylesheets_path, :preload => true), :stylesheets, :path_to_replace => Theme.knitkit_website_stylesheets_path)
|
279
|
+
create_theme_files_for_directory_node(file_support.build_tree(Theme.knitkit_website_javascripts_path, :preload => true), :javascripts, :path_to_replace => Theme.knitkit_website_javascripts_path)
|
216
280
|
create_theme_files_for_directory_node(file_support.build_tree(Theme.knitkit_website_images_path, :preload => true), :images, :path_to_replace => Theme.knitkit_website_images_path)
|
217
281
|
end
|
218
282
|
|
@@ -225,18 +289,40 @@ class Theme < ActiveRecord::Base
|
|
225
289
|
end
|
226
290
|
|
227
291
|
def save_theme_file(path, type, options)
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
292
|
+
ignored_css = [
|
293
|
+
'bootstrap.min.css',
|
294
|
+
'bootstrap-responsive.min.css',
|
295
|
+
'datepicker.css',
|
296
|
+
'inline_editing.css',
|
297
|
+
]
|
298
|
+
|
299
|
+
ignored_js = [
|
300
|
+
'bootstrap.min.js',
|
301
|
+
'bootstrap-datepicker.js',
|
302
|
+
'confirm-bootstrap.js',
|
303
|
+
'inline_editing.js',
|
304
|
+
'jquery.maskedinput.min.js',
|
305
|
+
'Main.js',
|
306
|
+
'View.js'
|
307
|
+
]
|
308
|
+
|
309
|
+
ignored_files = (ignored_css | ignored_js).flatten
|
310
|
+
|
311
|
+
unless ignored_files.any? { |w| path =~ /#{w}/ }
|
312
|
+
contents = IO.read(path)
|
313
|
+
contents.gsub!("<%= static_stylesheet_link_tag 'knitkit/custom.css' %>","<%= theme_stylesheet_link_tag '#{self.theme_id}','custom.css' %>") unless path.scan('base.html.erb').empty?
|
314
|
+
contents.gsub!("<%= static_javascript_include_tag 'knitkit/theme.js' %>","<%= theme_javascript_include_tag '#{self.theme_id}','theme.js' %>") unless path.scan('base.html.erb').empty?
|
315
|
+
|
316
|
+
path = case type
|
317
|
+
when :widgets
|
318
|
+
path.gsub(options[:path_to_replace], "#{self.url}/widgets/#{options[:widget_name]}")
|
319
|
+
else
|
320
|
+
path.gsub(options[:path_to_replace], "#{self.url}/#{type.to_s}")
|
321
|
+
end
|
322
|
+
|
323
|
+
self.add_file(contents, path)
|
237
324
|
end
|
238
325
|
|
239
|
-
self.add_file(contents, path)
|
240
326
|
end
|
241
|
-
|
242
327
|
end
|
328
|
+
|
data/app/models/website.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
class Website < ActiveRecord::Base
|
2
2
|
attr_protected :created_at, :updated_at
|
3
3
|
|
4
|
-
after_destroy
|
4
|
+
after_destroy :remove_sites_directory, :remove_website_role
|
5
5
|
before_destroy :destroy_sections
|
6
|
-
after_create
|
6
|
+
after_create :setup_website
|
7
7
|
|
8
8
|
protected_with_capabilities
|
9
9
|
has_file_assets
|
@@ -54,7 +54,7 @@ class Website < ActiveRecord::Base
|
|
54
54
|
|
55
55
|
alias :sections :website_sections
|
56
56
|
alias :hosts :website_hosts
|
57
|
-
|
57
|
+
|
58
58
|
#We only want to destroy parent sections as better nested set will destroy children for us
|
59
59
|
def destroy_sections
|
60
60
|
parents = []
|
@@ -63,8 +63,12 @@ class Website < ActiveRecord::Base
|
|
63
63
|
parents << section
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
67
|
-
parents.each {|parent| parent.destroy}
|
66
|
+
|
67
|
+
parents.each { |parent| parent.destroy }
|
68
|
+
end
|
69
|
+
|
70
|
+
def publishing?
|
71
|
+
self.publishing
|
68
72
|
end
|
69
73
|
|
70
74
|
def to_label
|
@@ -150,9 +154,7 @@ class Website < ActiveRecord::Base
|
|
150
154
|
def setup_website
|
151
155
|
PublishedWebsite.create(:website => self, :version => 0, :active => true, :comment => 'New Site Created')
|
152
156
|
SecurityRole.create(:description => "Website #{self.title}", :internal_identifier => website_role_iid) if self.role.nil?
|
153
|
-
configuration = ::Configuration.find_template('default_website_configuration').clone(true)
|
154
|
-
configuration.description = "Website #{self.name} Configuration"
|
155
|
-
configuration.internal_identifier = configuration.description.underscore
|
157
|
+
configuration = ::Configuration.find_template('default_website_configuration').clone(true, "Website #{self.title} Configuration", "Website #{self.title} Configuration".underscore)
|
156
158
|
configuration.update_configuration_item(ConfigurationItemType.find_by_internal_identifier('login_url'), '/login')
|
157
159
|
configuration.update_configuration_item(ConfigurationItemType.find_by_internal_identifier('homepage_url'), '/home')
|
158
160
|
self.configurations << configuration
|
@@ -230,7 +232,7 @@ class Website < ActiveRecord::Base
|
|
230
232
|
end
|
231
233
|
|
232
234
|
self.files.where("directory like '%/#{Rails.application.config.erp_tech_svcs.file_assets_location}/sites/#{self.iid}%'").all.each do |file_asset|
|
233
|
-
setup_hash[:files] << {:path => file_asset.directory, :name => file_asset.name, :roles => file_asset.roles.uniq.collect{|r| r.internal_identifier}}
|
235
|
+
setup_hash[:files] << {:path => file_asset.directory, :name => file_asset.name, :roles => file_asset.roles.uniq.collect { |r| r.internal_identifier }}
|
234
236
|
end
|
235
237
|
|
236
238
|
setup_hash
|
@@ -258,10 +260,8 @@ class Website < ActiveRecord::Base
|
|
258
260
|
file_assets_path = Pathname.new(File.join(tmp_dir, 'files'))
|
259
261
|
FileUtils.mkdir_p(file_assets_path) unless file_assets_path.exist?
|
260
262
|
|
261
|
-
sections.each do |website_section|
|
262
|
-
|
263
|
-
File.open(File.join(sections_path, "#{website_section.internal_identifier}.rhtml"), 'wb+') { |f| f.puts(website_section.layout) }
|
264
|
-
end
|
263
|
+
sections.where('parent_id is null').each do |website_section|
|
264
|
+
save_section_layout_to_file(sections_path, website_section)
|
265
265
|
end
|
266
266
|
|
267
267
|
contents = sections.collect(&:contents).flatten.uniq
|
@@ -307,11 +307,49 @@ class Website < ActiveRecord::Base
|
|
307
307
|
zip.add('setup.yml', tmp_dir + 'setup.yml')
|
308
308
|
end
|
309
309
|
end
|
310
|
+
|
311
|
+
end
|
312
|
+
|
313
|
+
def save_section_layout_to_file(sections_path, website_section)
|
314
|
+
unless website_section.layout.blank?
|
315
|
+
File.open(File.join(sections_path, "#{website_section.permalink}.rhtml"), 'wb+') { |f| f.puts(website_section.layout) }
|
316
|
+
end
|
317
|
+
|
318
|
+
# we need to handle child sections because internal identifier uniqueness is scoped by parent_id and website_id
|
319
|
+
# get all children of this section
|
320
|
+
unless website_section.children.empty?
|
321
|
+
sections_path = Pathname.new(File.join(sections_path, website_section.permalink))
|
322
|
+
FileUtils.mkdir_p(sections_path) unless sections_path.exist?
|
323
|
+
|
324
|
+
website_section.children.each do |website_section_child|
|
325
|
+
save_section_layout_to_file(sections_path, website_section_child)
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def export_template
|
331
|
+
tmp_dir = Website.make_tmp_dir
|
332
|
+
template_zip_path = export
|
333
|
+
|
334
|
+
if !themes.active.first.is_a?(Theme)
|
335
|
+
return false
|
336
|
+
end
|
337
|
+
|
338
|
+
theme_zip_path = themes.active.first.export
|
339
|
+
|
340
|
+
zip_file_name = File.join(tmp_dir, self.iid + '-composite.zip')
|
341
|
+
|
342
|
+
Zip::ZipFile.open(zip_file_name, Zip::ZipFile::CREATE) do |zip_file|
|
343
|
+
zip_file.add(File.basename(template_zip_path, '.zip') + '-template.zip', template_zip_path)
|
344
|
+
zip_file.add(File.basename(theme_zip_path, '.zip') + '-theme.zip', theme_zip_path)
|
345
|
+
end
|
346
|
+
|
347
|
+
File.join(tmp_dir, self.iid + '-composite.zip')
|
310
348
|
end
|
311
349
|
|
312
350
|
class << self
|
313
351
|
def make_tmp_dir
|
314
|
-
Pathname.new(Rails.root
|
352
|
+
Pathname.new(File.join(Rails.root, "/tmp/website_export/tmp_#{Time.now.to_i.to_s}")).tap do |dir|
|
315
353
|
FileUtils.mkdir_p(dir) unless dir.exist?
|
316
354
|
end
|
317
355
|
end
|
@@ -319,7 +357,7 @@ class Website < ActiveRecord::Base
|
|
319
357
|
def import(file, current_user)
|
320
358
|
file_support = ErpTechSvcs::FileSupport::Base.new(:storage => Rails.application.config.erp_tech_svcs.file_storage)
|
321
359
|
message = ''
|
322
|
-
|
360
|
+
website = nil
|
323
361
|
|
324
362
|
file = ActionController::UploadedTempfile.new("uploaded-theme").tap do |f|
|
325
363
|
f.puts file.read
|
@@ -404,7 +442,7 @@ class Website < ActiveRecord::Base
|
|
404
442
|
file = website.add_file(content[:data], File.join(file_support.root, file_asset[:path], file_asset[:name]))
|
405
443
|
|
406
444
|
#handle security
|
407
|
-
unless file_asset[:roles].empty?
|
445
|
+
unless file_asset[:roles].empty?
|
408
446
|
capability = file.add_capability(:download)
|
409
447
|
file_asset[:roles].each do |role_iid|
|
410
448
|
role = SecurityRole.find_by_internal_identifier(role_iid)
|
@@ -443,6 +481,173 @@ class Website < ActiveRecord::Base
|
|
443
481
|
|
444
482
|
website.publish("Website Imported", current_user)
|
445
483
|
|
484
|
+
rescue => ex
|
485
|
+
Rails.logger.error "#{ex.inspect} #{ex.backtrace}"
|
486
|
+
website.destroy unless website.nil?
|
487
|
+
raise ex
|
488
|
+
end
|
489
|
+
|
490
|
+
website.save
|
491
|
+
else
|
492
|
+
message = 'Website already exists with that internal_identifier'
|
493
|
+
end
|
494
|
+
|
495
|
+
return website, message
|
496
|
+
end
|
497
|
+
|
498
|
+
def import_template_director(file, current_user)
|
499
|
+
file_object = file.tempfile
|
500
|
+
file_path = file_object.path
|
501
|
+
|
502
|
+
entries = []
|
503
|
+
begin
|
504
|
+
Zip::ZipFile.open(file_path) { |zip_file|
|
505
|
+
zip_file.each { |f|
|
506
|
+
f_path=File.join('public/waste', f.name)
|
507
|
+
FileUtils.mkdir_p(File.dirname(f_path))
|
508
|
+
zip_file.extract(f, f_path) unless File.exist?(f_path)
|
509
|
+
entries << f.name
|
510
|
+
}
|
511
|
+
}
|
512
|
+
|
513
|
+
entries.each do |entry|
|
514
|
+
if entry.match(/-template.zip/)
|
515
|
+
@website_result = import_template('public/waste/' + entry, current_user)
|
516
|
+
end
|
517
|
+
end
|
518
|
+
entries.each do |entry|
|
519
|
+
if entry.match(/-theme.zip/)
|
520
|
+
Theme.import_download_item('public/waste/' + entry, @website_result[0])
|
521
|
+
end
|
522
|
+
end
|
523
|
+
return @website_result[0], @website_result[1]
|
524
|
+
rescue Exception => e
|
525
|
+
return false, "Error"
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
529
|
+
def import_template(file, current_user)
|
530
|
+
file_support = ErpTechSvcs::FileSupport::Base.new(:storage => Rails.application.config.erp_tech_svcs.file_storage)
|
531
|
+
message = ''
|
532
|
+
website = nil
|
533
|
+
|
534
|
+
entries = []
|
535
|
+
setup_hash = nil
|
536
|
+
|
537
|
+
tmp_dir = Website.make_tmp_dir
|
538
|
+
|
539
|
+
Zip::ZipFile.open(file) do |zip|#passing in a file
|
540
|
+
#Zip::ZipFile.open(file.path) do |zip|
|
541
|
+
zip.each do |entry|
|
542
|
+
f_path = File.join(tmp_dir.to_s, entry.name)
|
543
|
+
FileUtils.mkdir_p(File.dirname(f_path))
|
544
|
+
zip.extract(entry, f_path) unless File.exist?(f_path)
|
545
|
+
|
546
|
+
next if entry.name =~ /__MACOSX\//
|
547
|
+
if entry.name =~ /setup.yml/
|
548
|
+
data = ''
|
549
|
+
entry.get_input_stream { |io| data = io.read }
|
550
|
+
data = StringIO.new(data) if data.present?
|
551
|
+
setup_hash = YAML.load(data)
|
552
|
+
else
|
553
|
+
type = entry.name.split('/')[0]
|
554
|
+
name = entry.name.split('/').last
|
555
|
+
next if name.nil?
|
556
|
+
|
557
|
+
if File.exist?(f_path) and !File.directory?(f_path)
|
558
|
+
entry_hash = {:type => type, :name => name, :path => entry.name}
|
559
|
+
entries << entry_hash unless name == 'sections' || name == 'articles' || name == 'excerpts' || name == 'documented contents'
|
560
|
+
entry_hash[:data] = File.open(f_path, "rb") { |io| io.read }
|
561
|
+
end
|
562
|
+
end
|
563
|
+
|
564
|
+
end
|
565
|
+
end
|
566
|
+
entries.uniq!
|
567
|
+
FileUtils.rm_rf(tmp_dir.to_s)
|
568
|
+
|
569
|
+
if Website.find_by_internal_identifier(setup_hash[:internal_identifier]).nil?
|
570
|
+
website = Website.new(
|
571
|
+
:name => setup_hash[:name],
|
572
|
+
:title => setup_hash[:title],
|
573
|
+
:subtitle => setup_hash[:subtitle],
|
574
|
+
:internal_identifier => setup_hash[:internal_identifier]
|
575
|
+
)
|
576
|
+
|
577
|
+
#TODO update to handle configurations
|
578
|
+
|
579
|
+
website.save!
|
580
|
+
|
581
|
+
#set default publication published by user
|
582
|
+
first_publication = website.published_websites.first
|
583
|
+
first_publication.published_by = current_user
|
584
|
+
first_publication.save
|
585
|
+
|
586
|
+
begin
|
587
|
+
#handle images
|
588
|
+
# entries.each do |entry|
|
589
|
+
# puts "entry type '#{entry[:type]}'"
|
590
|
+
# puts "entry name '#{entry[:name]}'"
|
591
|
+
# puts "entry path '#{entry[:path]}'"
|
592
|
+
# puts "entry data #{!entry[:data].blank?}"
|
593
|
+
# end
|
594
|
+
# puts "------------------"
|
595
|
+
setup_hash[:images].each do |image_asset|
|
596
|
+
filename = 'images' + image_asset[:path] + '/' + image_asset[:name]
|
597
|
+
#puts "image_asset '#{filename}'"
|
598
|
+
content = entries.find { |entry| entry[:type] == 'images' and entry[:path] == filename }
|
599
|
+
unless content.nil?
|
600
|
+
website.add_file(content[:data], File.join(file_support.root, image_asset[:path], image_asset[:name]))
|
601
|
+
end
|
602
|
+
end
|
603
|
+
|
604
|
+
#handle files
|
605
|
+
setup_hash[:files].each do |file_asset|
|
606
|
+
filename = 'files' + file_asset[:path] + '/' + file_asset[:name]
|
607
|
+
#puts "file_asset '#{filename}'"
|
608
|
+
content = entries.find { |entry| entry[:type] == 'files' and entry[:path] == filename }
|
609
|
+
unless content.nil?
|
610
|
+
file = website.add_file(content[:data], File.join(file_support.root, file_asset[:path], file_asset[:name]))
|
611
|
+
|
612
|
+
#handle security
|
613
|
+
unless file_asset[:roles].empty?
|
614
|
+
capability = file.add_capability(:download)
|
615
|
+
file_asset[:roles].each do |role_iid|
|
616
|
+
role = SecurityRole.find_by_internal_identifier(role_iid)
|
617
|
+
role.add_capability(capability)
|
618
|
+
end
|
619
|
+
end
|
620
|
+
end
|
621
|
+
end
|
622
|
+
|
623
|
+
#handle hosts
|
624
|
+
if WebsiteHost.last
|
625
|
+
setup_hash.merge(:hosts => 'localhost:3000')
|
626
|
+
end
|
627
|
+
|
628
|
+
if !setup_hash[:hosts].blank? and !setup_hash[:hosts].empty?
|
629
|
+
#set first host as primary host in configuration
|
630
|
+
website.configurations.first.update_configuration_item(ConfigurationItemType.find_by_internal_identifier('primary_host'), 'localhost:3000')
|
631
|
+
website.save
|
632
|
+
end
|
633
|
+
|
634
|
+
#handle sections
|
635
|
+
setup_hash[:sections].each do |section_hash|
|
636
|
+
build_section(section_hash, entries, website, current_user)
|
637
|
+
end
|
638
|
+
website.website_sections.update_paths!
|
639
|
+
|
640
|
+
#handle website_navs
|
641
|
+
setup_hash[:website_navs].each do |website_nav_hash|
|
642
|
+
website_nav = WebsiteNav.new(:name => website_nav_hash[:name])
|
643
|
+
website_nav_hash[:items].each do |item|
|
644
|
+
website_nav.website_nav_items << build_menu_item(item)
|
645
|
+
end
|
646
|
+
website.website_navs << website_nav
|
647
|
+
end
|
648
|
+
|
649
|
+
website.publish("Website Imported", current_user)
|
650
|
+
|
446
651
|
rescue Exception => ex
|
447
652
|
Rails.logger.error "#{ex.inspect} #{ex.backtrace}"
|
448
653
|
website.destroy unless website.nil?
|
@@ -450,17 +655,38 @@ class Website < ActiveRecord::Base
|
|
450
655
|
end
|
451
656
|
|
452
657
|
website.save
|
453
|
-
success = true
|
454
658
|
else
|
455
659
|
message = 'Website already exists with that internal_identifier'
|
456
|
-
success = false
|
457
660
|
end
|
458
661
|
|
459
|
-
return
|
662
|
+
return website, message
|
663
|
+
end
|
664
|
+
|
665
|
+
|
666
|
+
def find_site_entry_in_zip(file)
|
667
|
+
zf = Zip::ZipFile.open(file)
|
668
|
+
zf.each_with_index { |entry, index|
|
669
|
+
if entry.name.match(/-template.zip/) && !entry.name.match(/_./)
|
670
|
+
return entry
|
671
|
+
end
|
672
|
+
}
|
673
|
+
end
|
674
|
+
|
675
|
+
def find_theme_entries_in_zip(file)
|
676
|
+
entries = []
|
677
|
+
zf = Zip::ZipFile.new(file)
|
678
|
+
zf.each_with_index { |entry, index|
|
679
|
+
if entry.name.match(/-theme.zip/) && !entry.name.match(/_./)
|
680
|
+
entries << entry
|
681
|
+
end
|
682
|
+
}
|
683
|
+
entries
|
460
684
|
end
|
461
685
|
|
686
|
+
|
462
687
|
protected
|
463
688
|
|
689
|
+
|
464
690
|
def build_menu_item(hash)
|
465
691
|
website_item = WebsiteNavItem.new(
|
466
692
|
:title => hash[:title],
|
@@ -475,16 +701,16 @@ class Website < ActiveRecord::Base
|
|
475
701
|
child_website_item = build_menu_item(item)
|
476
702
|
child_website_item.move_to_child_of(website_item)
|
477
703
|
end
|
478
|
-
|
704
|
+
|
479
705
|
#handle security
|
480
|
-
unless hash[:roles].empty?
|
706
|
+
unless hash[:roles].empty?
|
481
707
|
capability = website_item.add_capability(:view)
|
482
708
|
hash[:roles].each do |role_iid|
|
483
709
|
role = SecurityRole.find_by_internal_identifier(role_iid)
|
484
710
|
role.add_capability(capability)
|
485
711
|
end
|
486
712
|
end
|
487
|
-
|
713
|
+
|
488
714
|
website_item
|
489
715
|
end
|
490
716
|
|
@@ -498,7 +724,9 @@ class Website < ActiveRecord::Base
|
|
498
724
|
section.internal_identifier = hash[:internal_identifier]
|
499
725
|
section.permalink = hash[:permalink]
|
500
726
|
section.path = hash[:path]
|
501
|
-
content = entries.find
|
727
|
+
content = entries.find do |entry|
|
728
|
+
entry[:type] == 'sections' and entry[:name] == "#{hash[:permalink]}.rhtml" and entry[:path].split('.')[0] == "sections#{hash[:path]}"
|
729
|
+
end
|
502
730
|
|
503
731
|
section.layout = content[:data] unless content.nil?
|
504
732
|
|
@@ -529,7 +757,7 @@ class Website < ActiveRecord::Base
|
|
529
757
|
if section.is_a? OnlineDocumentSection
|
530
758
|
section.use_markdown = hash[:use_markdown]
|
531
759
|
section.save
|
532
|
-
extension_type =
|
760
|
+
extension_type = hash[:use_markdown] ? 'md' : 'html'
|
533
761
|
entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{section.internal_identifier}.#{extension_type}" }[:data]
|
534
762
|
documented_content = DocumentedContent.create(:title => section.title, :body_html => entry_data)
|
535
763
|
DocumentedItem.create(:documented_content_id => documented_content.id, :online_document_section_id => section.id)
|
@@ -541,27 +769,31 @@ class Website < ActiveRecord::Base
|
|
541
769
|
child_section.save
|
542
770
|
child_section.move_to_child_of(section)
|
543
771
|
# CREATE THE DOCUMENTED CONTENT HERE
|
544
|
-
extension_type =
|
772
|
+
extension_type = section_hash[:use_markdown] ? 'md' : 'html'
|
545
773
|
entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{child_section.internal_identifier}.#{extension_type}" }[:data]
|
546
774
|
documented_content = DocumentedContent.create(:title => child_section.title, :body_html => entry_data)
|
547
775
|
DocumentedItem.create(:documented_content_id => documented_content.id, :online_document_section_id => child_section.id)
|
548
776
|
end
|
549
777
|
end
|
550
|
-
|
778
|
+
|
551
779
|
#handle security
|
552
780
|
if hash[:roles] #if this is a OnlineDocumentSection will not have roles
|
553
|
-
unless hash[:roles].empty?
|
781
|
+
unless hash[:roles].empty?
|
554
782
|
capability = section.add_capability(:view)
|
555
783
|
hash[:roles].each do |role_iid|
|
556
784
|
role = SecurityRole.find_by_internal_identifier(role_iid)
|
785
|
+
if role.nil?
|
786
|
+
role = SecurityRole.create(internal_identifier: role_iid, description: role_iid.humanize)
|
787
|
+
end
|
557
788
|
role.add_capability(capability)
|
558
789
|
end
|
559
790
|
end
|
560
791
|
end
|
561
|
-
|
792
|
+
|
562
793
|
section
|
563
794
|
end
|
564
795
|
|
796
|
+
|
565
797
|
end
|
566
798
|
|
567
799
|
def website_role_iid
|