camaleon_cms 2.1.2.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of camaleon_cms might be problematic. Click here for more details.

Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -4
  3. data/app/apps/plugins/attack/attack_helper.rb +3 -0
  4. data/app/apps/plugins/attack/config/custom_models.rb +4 -2
  5. data/app/apps/plugins/attack/config/locales/translation.yml +19 -0
  6. data/app/apps/plugins/attack/models/attack.rb +1 -1
  7. data/app/apps/plugins/front_cache/config/initializer.rb +4 -2
  8. data/app/apps/plugins/front_cache/config/locales/translation.yml +19 -0
  9. data/app/apps/themes/camaleon_first/main_helper.rb +1 -3
  10. data/app/apps/themes/default/views/admin/settings.html.erb +0 -1
  11. data/app/apps/themes/default/views/layouts/index.html.erb +5 -5
  12. data/app/apps/themes/new/assets/css/main.css +1 -1
  13. data/app/apps/themes/new/assets/js/main.js +1 -1
  14. data/app/apps/themes/new/views/admin/settings.html.erb +1 -1
  15. data/app/assets/images/camaleon_cms/language/{pt_br.png → pt-BR.png} +0 -0
  16. data/app/assets/javascripts/camaleon_cms/admin/_custom_fields.js +105 -51
  17. data/app/assets/javascripts/camaleon_cms/admin/_libraries.js +4 -2
  18. data/app/assets/javascripts/camaleon_cms/admin/_translator.js +2 -2
  19. data/app/assets/javascripts/camaleon_cms/admin/custom_fields_form.js +9 -7
  20. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/{pt_br.js → pt-BR.js} +0 -0
  21. data/app/assets/javascripts/camaleon_cms/admin/momentjs/{pt_br.js → pt-BR.js} +1 -1
  22. data/app/assets/javascripts/camaleon_cms/admin/nav_menu.js.coffee +15 -1
  23. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/{pt_br.js → pt-BR.js} +1 -1
  24. data/app/assets/javascripts/camaleon_cms/admin/uploader/_media_manager.js.coffee +24 -12
  25. data/app/assets/stylesheets/camaleon_cms/admin/_custom_admin.css.scss +9 -0
  26. data/app/assets/stylesheets/camaleon_cms/admin/lte/_admin.css.scss +1 -1
  27. data/app/controllers/camaleon_cms/admin/appearances/nav_menus_controller.rb +13 -6
  28. data/app/controllers/camaleon_cms/admin/appearances/themes_controller.rb +1 -1
  29. data/app/controllers/camaleon_cms/admin/appearances/widgets/assign_controller.rb +1 -1
  30. data/app/controllers/camaleon_cms/admin/appearances/widgets/main_controller.rb +1 -1
  31. data/app/controllers/camaleon_cms/admin/appearances/widgets/sidebar_controller.rb +1 -1
  32. data/app/controllers/camaleon_cms/admin/comments_controller.rb +1 -1
  33. data/app/controllers/camaleon_cms/admin/media_controller.rb +15 -5
  34. data/app/controllers/camaleon_cms/admin/plugins_controller.rb +1 -1
  35. data/app/controllers/camaleon_cms/admin/settings/custom_fields_controller.rb +14 -8
  36. data/app/controllers/camaleon_cms/admin/settings_controller.rb +22 -7
  37. data/app/controllers/camaleon_cms/admin/user_roles_controller.rb +1 -1
  38. data/app/controllers/camaleon_cms/admin/users_controller.rb +1 -1
  39. data/app/controllers/camaleon_cms/apps/plugins_admin_controller.rb +4 -1
  40. data/app/controllers/camaleon_cms/apps/plugins_front_controller.rb +5 -10
  41. data/app/controllers/camaleon_cms/apps/themes_front_controller.rb +1 -4
  42. data/app/controllers/camaleon_cms/camaleon_controller.rb +4 -13
  43. data/app/controllers/camaleon_cms/frontend_controller.rb +15 -9
  44. data/app/controllers/concerns/camaleon_cms/frontend_concern.rb +17 -8
  45. data/app/decorators/camaleon_cms/application_decorator.rb +3 -3
  46. data/app/decorators/camaleon_cms/custom_fields_concern.rb +21 -6
  47. data/app/decorators/camaleon_cms/post_comment_decorator.rb +21 -0
  48. data/app/decorators/camaleon_cms/site_decorator.rb +5 -5
  49. data/app/decorators/camaleon_cms/theme_decorator.rb +10 -0
  50. data/app/decorators/camaleon_cms/user_decorator.rb +2 -2
  51. data/app/helpers/camaleon_cms/admin/custom_fields_helper.rb +24 -2
  52. data/app/helpers/camaleon_cms/admin/menus_helper.rb +13 -12
  53. data/app/helpers/camaleon_cms/frontend/application_helper.rb +1 -1
  54. data/app/helpers/camaleon_cms/frontend/nav_menu_helper.rb +7 -6
  55. data/app/helpers/camaleon_cms/plugins_helper.rb +20 -18
  56. data/app/helpers/camaleon_cms/site_helper.rb +1 -20
  57. data/app/helpers/camaleon_cms/theme_helper.rb +1 -1
  58. data/app/helpers/camaleon_cms/uploader_helper.rb +25 -20
  59. data/app/helpers/camaleon_cms/user_roles_helper.rb +6 -1
  60. data/app/mailers/camaleon_cms/html_mailer.rb +2 -1
  61. data/app/models/camaleon_cms/ability.rb +3 -26
  62. data/app/models/camaleon_cms/custom_field.rb +2 -1
  63. data/app/models/camaleon_cms/custom_field_group.rb +23 -22
  64. data/app/models/camaleon_cms/custom_fields_relationship.rb +1 -1
  65. data/app/models/camaleon_cms/nav_menu.rb +1 -1
  66. data/app/models/camaleon_cms/nav_menu_item.rb +12 -19
  67. data/app/models/camaleon_cms/post.rb +1 -1
  68. data/app/models/camaleon_cms/post_comment.rb +3 -1
  69. data/app/models/camaleon_cms/post_default.rb +1 -1
  70. data/app/models/camaleon_cms/post_type.rb +5 -4
  71. data/app/models/camaleon_cms/site.rb +12 -0
  72. data/app/models/camaleon_cms/term_taxonomy.rb +1 -1
  73. data/app/models/camaleon_cms/user_role.rb +5 -1
  74. data/app/models/concerns/camaleon_cms/custom_fields_read.rb +99 -49
  75. data/app/uploaders/camaleon_cms_aws_uploader.rb +1 -1
  76. data/app/uploaders/camaleon_cms_local_uploader.rb +19 -3
  77. data/app/uploaders/camaleon_cms_uploader.rb +13 -6
  78. data/app/views/camaleon_cms/admin/appearances/nav_menus/_custom_menus.html.erb +9 -2
  79. data/app/views/camaleon_cms/admin/appearances/nav_menus/_form.html.erb +1 -1
  80. data/app/views/camaleon_cms/admin/appearances/nav_menus/_menu_items.html.erb +2 -2
  81. data/app/views/camaleon_cms/admin/appearances/themes/index.html.erb +1 -3
  82. data/app/views/camaleon_cms/admin/media/_render_file_item.html.erb +1 -0
  83. data/app/views/camaleon_cms/admin/media/index.html.erb +3 -3
  84. data/app/views/camaleon_cms/admin/posts/_sidebar.html.erb +1 -1
  85. data/app/views/camaleon_cms/admin/posts/form.html.erb +1 -1
  86. data/app/views/camaleon_cms/admin/settings/_configuration_settings.html.erb +4 -0
  87. data/app/views/camaleon_cms/admin/settings/custom_fields/_get_items.html.erb +6 -6
  88. data/app/views/camaleon_cms/admin/settings/custom_fields/_meta_data.html.erb +0 -9
  89. data/app/views/camaleon_cms/admin/settings/custom_fields/_render.html.erb +39 -55
  90. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_audio.html.erb +1 -1
  91. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_checkbox.html.erb +2 -2
  92. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_checkboxes.html.erb +3 -3
  93. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_colorpicker.html.erb +3 -3
  94. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_date.html.erb +3 -3
  95. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_editor.html.erb +2 -2
  96. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_email.html.erb +1 -1
  97. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_field_attrs.html.erb +3 -3
  98. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_file.html.erb +1 -1
  99. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_image.html.erb +2 -2
  100. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_numeric.html.erb +1 -1
  101. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_phone.html.erb +1 -1
  102. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_posts.html.erb +3 -3
  103. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_private_file.html.erb +4 -0
  104. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_radio.html.erb +3 -3
  105. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_select.html.erb +3 -3
  106. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_select_eval.html.erb +1 -1
  107. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_text_area.html.erb +2 -2
  108. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_text_box.html.erb +2 -2
  109. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_url.html.erb +1 -1
  110. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_users.html.erb +1 -1
  111. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_video.html.erb +1 -1
  112. data/app/views/camaleon_cms/admin/settings/custom_fields/form.html.erb +8 -0
  113. data/app/views/camaleon_cms/admin/settings/site.html.erb +1 -20
  114. data/app/views/camaleon_cms/admin/settings/theme.html.erb +20 -0
  115. data/app/views/camaleon_cms/admin/user_roles/form.html.erb +2 -2
  116. data/app/views/camaleon_cms/default_theme/admin/settings.html.erb +0 -1
  117. data/app/views/camaleon_cms/default_theme/partials/_comments.html.erb +0 -2
  118. data/app/views/camaleon_cms/default_theme/partials/_search_form.html.erb +1 -1
  119. data/app/views/camaleon_cms/default_theme/partials/_sidebar.html.erb +3 -3
  120. data/app/views/layouts/camaleon_cms/admin/_footer.html.erb +1 -1
  121. data/config/initializers/action_view.rb +12 -7
  122. data/config/initializers/custom_initializers.rb +6 -12
  123. data/config/locales/camaleon_cms/admin/en.yml +1 -0
  124. data/config/locales/camaleon_cms/admin/es.yml +4 -0
  125. data/config/locales/camaleon_cms/admin/it.yml +1 -24
  126. data/config/locales/camaleon_cms/admin/js.yml +41 -0
  127. data/config/locales/camaleon_cms/admin/{pt_br.yml → pt-BR.yml} +48 -18
  128. data/config/locales/camaleon_cms/common.yml +66 -0
  129. data/config/locales/camaleon_cms/languages.yml +13 -0
  130. data/config/locales/camaleon_cms/routes.yml +2 -2
  131. data/config/routes/admin.rb +3 -0
  132. data/config/system.json +3 -3
  133. data/db/migrate/20160606135421_improve_menus_structure.rb +7 -0
  134. data/db/migrate/20160609121449_add_group_to_custom_field_values.rb +5 -0
  135. data/lib/camaleon_cms/engine.rb +4 -3
  136. data/lib/camaleon_cms/version.rb +1 -1
  137. data/lib/ext/string.rb +20 -0
  138. data/lib/ext/translator.rb +2 -2
  139. data/lib/generators/camaleon_cms/gem_plugin_generator.rb +1 -1
  140. data/lib/generators/camaleon_cms/gem_plugin_template/config/camaleon_plugin.json +1 -1
  141. data/lib/generators/camaleon_cms/install_generator.rb +1 -0
  142. data/lib/generators/camaleon_cms/theme_template/app/apps/themes/my_theme/main_helper.rb +1 -4
  143. data/lib/generators/camaleon_cms/theme_template/app/apps/themes/my_theme/views/index.html.erb +1 -25
  144. data/lib/generators/camaleon_cms/theme_template/app/apps/themes/my_theme/views/layouts/index.html.erb +17 -18
  145. data/lib/plugin_routes.rb +4 -4
  146. metadata +25 -48
  147. data/app/apps/plugins/contact_form/admin_forms_controller.rb +0 -85
  148. data/app/apps/plugins/contact_form/assets/css/admin/form-builder/formbuilder.css +0 -70
  149. data/app/apps/plugins/contact_form/assets/css/contact-form.css +0 -8
  150. data/app/apps/plugins/contact_form/assets/css/front/railsform.scss +0 -94
  151. data/app/apps/plugins/contact_form/assets/css/readme.txt +0 -1
  152. data/app/apps/plugins/contact_form/assets/js/contact_form.js +0 -2
  153. data/app/apps/plugins/contact_form/assets/js/form-builder/formbuilder.js +0 -1271
  154. data/app/apps/plugins/contact_form/assets/js/form-builder/vendor.js +0 -3072
  155. data/app/apps/plugins/contact_form/assets/js/readme.txt +0 -1
  156. data/app/apps/plugins/contact_form/config/config.json +0 -35
  157. data/app/apps/plugins/contact_form/config/custom_models.rb +0 -3
  158. data/app/apps/plugins/contact_form/config/locales/readme.txt +0 -1
  159. data/app/apps/plugins/contact_form/config/locales/translation.yml +0 -315
  160. data/app/apps/plugins/contact_form/config/routes_admin.txt +0 -4
  161. data/app/apps/plugins/contact_form/config/routes_front.txt +0 -2
  162. data/app/apps/plugins/contact_form/contact_form_helper.rb +0 -154
  163. data/app/apps/plugins/contact_form/contact_form_html_helper.rb +0 -140
  164. data/app/apps/plugins/contact_form/front_controller.rb +0 -50
  165. data/app/apps/plugins/contact_form/models/contact_form.rb +0 -26
  166. data/app/apps/plugins/contact_form/views/admin_forms/_form.html.erb +0 -33
  167. data/app/apps/plugins/contact_form/views/admin_forms/edit.html.erb +0 -338
  168. data/app/apps/plugins/contact_form/views/admin_forms/index.html.erb +0 -65
  169. data/app/apps/plugins/contact_form/views/admin_forms/responses.html.erb +0 -60
  170. data/app/apps/plugins/contact_form/views/contact_form/_email_content.html.erb +0 -26
  171. data/app/apps/plugins/contact_form/views/forms_shorcode.html.erb +0 -28
  172. data/app/apps/plugins/contact_form/views/front/index.html.erb +0 -3
  173. data/app/apps/themes/camaleon_first/views/admin/settings.html.erb +0 -4
  174. data/app/apps/themes/new/assets/css/bootstrap/bootstrap.min.css +0 -6735
  175. data/app/apps/themes/new/assets/js/plugins/bootstrap/bootstrap.min.js +0 -6
  176. data/app/apps/themes/new/assets/js/plugins/jquery/jquery.min.js +0 -4
  177. data/lib/generators/camaleon_cms/gem_theme_generator.rb +0 -97
  178. data/lib/generators/camaleon_cms/gem_theme_template/app/assets/images/themes/my_plugin/image.png +0 -0
  179. data/lib/generators/camaleon_cms/gem_theme_template/app/assets/javascripts/themes/my_plugin/main.js +0 -14
  180. data/lib/generators/camaleon_cms/gem_theme_template/app/assets/stylesheets/themes/my_plugin/main.css +0 -13
  181. data/lib/generators/camaleon_cms/gem_theme_template/app/helpers/themes/my_plugin/main_helper.rb +0 -26
  182. data/lib/generators/camaleon_cms/gem_theme_template/app/views/themes/my_plugin/admin/settings.html.erb +0 -4
  183. data/lib/generators/camaleon_cms/gem_theme_template/app/views/themes/my_plugin/index.html.erb +0 -25
  184. data/lib/generators/camaleon_cms/gem_theme_template/app/views/themes/my_plugin/layouts/index.html.erb +0 -70
  185. data/lib/generators/camaleon_cms/gem_theme_template/app/views/themes/my_plugin/partials/readme.txt +0 -1
  186. data/lib/generators/camaleon_cms/gem_theme_template/config/camaleon_theme.json +0 -14
@@ -35,6 +35,6 @@ module CamaleonCms::Frontend::ApplicationHelper
35
35
  options[:locale] = nil if options[:locale].present? && current_site.get_languages.first.to_s == options[:locale].to_s
36
36
  end
37
37
  options.delete(:format) if PluginRoutes.system_info["skip_format_url"].present?
38
- send(url_to, *(args << options))
38
+ send(url_to.gsub('-', '_'), *(args << options))
39
39
  end
40
40
  end
@@ -144,6 +144,7 @@ module CamaleonCms::Frontend::NavMenuHelper
144
144
  end
145
145
  r[:levels] = r[:levels] + 1
146
146
  end
147
+ is_current_parent = true if r[:current_item]
147
148
  levels << r[:levels]
148
149
  res << r
149
150
  end
@@ -183,24 +184,24 @@ module CamaleonCms::Frontend::NavMenuHelper
183
184
 
184
185
  private
185
186
  def _get_link_nav_menu(nav_menu_item)
186
- type_menu = nav_menu_item.get_option('type')
187
+ type_menu = nav_menu_item.kind
187
188
  begin
188
189
  case type_menu
189
190
  when 'post'
190
- post = CamaleonCms::Post.find(nav_menu_item.get_option('object_id')).decorate
191
+ post = CamaleonCms::Post.find(nav_menu_item.url).decorate
191
192
  return false unless post.can_visit?
192
193
  r = {link: post.the_url(as_path: true), name: post.the_title, type_menu: type_menu, current: @cama_visited_post.present? && @cama_visited_post.id == post.id}
193
194
  when 'category'
194
- category = CamaleonCms::Category.find(nav_menu_item.get_option('object_id')).decorate
195
+ category = CamaleonCms::Category.find(nav_menu_item.url).decorate
195
196
  r = {link: category.the_url(as_path: true), name: category.the_title, type_menu: type_menu, current: @cama_visited_category.present? && @cama_visited_category.id == category.id}
196
197
  when 'post_tag'
197
- post_tag = CamaleonCms::PostTag.find(nav_menu_item.get_option('object_id')).decorate
198
+ post_tag = CamaleonCms::PostTag.find(nav_menu_item.url).decorate
198
199
  r = {link: post_tag.the_url(as_path: true), name: post_tag.the_title, type_menu: type_menu, current: @cama_visited_tag.present? && @cama_visited_tag.id == post_tag.id}
199
200
  when 'post_type'
200
- post_type = CamaleonCms::PostType.find(nav_menu_item.get_option('object_id')).decorate
201
+ post_type = CamaleonCms::PostType.find(nav_menu_item.url).decorate
201
202
  r = {link: post_type.the_url(as_path: true), name: post_type.the_title, type_menu: type_menu, current: @cama_visited_post_type.present? && @cama_visited_post_type.id == post_type.id}
202
203
  when 'external'
203
- r = {link: nav_menu_item.get_option('object_id', "").to_s.translate, name: nav_menu_item.name.to_s.translate, type_menu: type_menu, current: false}
204
+ r = {link: nav_menu_item.url.to_s.translate, name: nav_menu_item.name.to_s.translate, type_menu: type_menu, current: false}
204
205
  r[:link] = cama_root_path if r[:link] == "root_url"
205
206
  r[:link] = site_current_path if site_current_path == "#{current_site.the_path}#{r[:link]}"
206
207
  r[:current] = r[:link] == site_current_url || r[:link] == site_current_path
@@ -69,11 +69,11 @@ module CamaleonCms::PluginsHelper
69
69
  # return plugin full layout path
70
70
  # plugin_key: plugin name
71
71
  def plugin_layout(layout_name, plugin_key = nil)
72
- plugin = current_plugin(plugin_key || self_plugin_key(1))
73
- if plugin.settings["gem_mode"]
74
- "plugins/#{plugin.slug}/layouts/#{layout_name}"
72
+ key = plugin_key || self_plugin_key(1)
73
+ if PluginRoutes.plugin_info(key)["gem_mode"]
74
+ "plugins/#{key}/layouts/#{layout_name}"
75
75
  else
76
- "plugins/#{plugin.slug}/views/layouts/#{layout_name}"
76
+ "plugins/#{key}/views/layouts/#{layout_name}"
77
77
  end
78
78
  end
79
79
 
@@ -85,12 +85,11 @@ module CamaleonCms::PluginsHelper
85
85
  view_name = plugin_key
86
86
  plugin_key = k
87
87
  end
88
-
89
- plugin = current_plugin(plugin_key || self_plugin_key(1))
90
- if plugin.settings["gem_mode"]
91
- "plugins/#{plugin.slug}/#{view_name}"
88
+ key = plugin_key || self_plugin_key(1)
89
+ if PluginRoutes.plugin_info(key)["gem_mode"]
90
+ "plugins/#{key}/#{view_name}"
92
91
  else
93
- "plugins/#{plugin.slug}/views/#{view_name}"
92
+ "plugins/#{key}/views/#{view_name}"
94
93
  end
95
94
  end
96
95
 
@@ -103,12 +102,11 @@ module CamaleonCms::PluginsHelper
103
102
  if plugin_key.present? && plugin_key.include?("/")
104
103
  return plugin_asset_url(plugin_key, asset || self_plugin_key(1))
105
104
  end
106
- settings = current_plugin(plugin_key || self_plugin_key(1)).settings
107
- folder_name = settings["key"]
108
- if settings["gem_mode"]
109
- "plugins/#{folder_name}/#{asset}"
105
+ key = plugin_key || self_plugin_key(1)
106
+ if PluginRoutes.plugin_info(key)["gem_mode"]
107
+ "plugins/#{key}/#{asset}"
110
108
  else
111
- "plugins/#{folder_name}/assets/#{asset}"
109
+ "plugins/#{key}/assets/#{asset}"
112
110
  end
113
111
  end
114
112
  alias_method :plugin_asset, :plugin_asset_path
@@ -120,9 +118,8 @@ module CamaleonCms::PluginsHelper
120
118
  # sample:
121
119
  # plugin_asset_url("css/main.css") => return: http://myhost.com/assets/plugins/my_plugin/assets/css/main-54505620f.css
122
120
  def plugin_asset_url(asset, plugin_key = nil)
123
- settings = current_plugin(plugin_key || self_plugin_key(1)).settings
124
- folder_name = settings["key"]
125
- p = settings["gem_mode"] ? "plugins/#{folder_name}/#{asset}" : "plugins/#{folder_name}/assets/#{asset}"
121
+ key = plugin_key || self_plugin_key(1)
122
+ p = PluginRoutes.plugin_info(key)["gem_mode"] ? "plugins/#{key}/#{asset}" : "plugins/#{key}/assets/#{asset}"
126
123
  begin
127
124
  asset_url(p)
128
125
  rescue NoMethodError => e
@@ -150,7 +147,12 @@ module CamaleonCms::PluginsHelper
150
147
  def self_plugin_key(index = 0)
151
148
  k = "/plugins/"
152
149
  f = caller[index]
153
- f.split(k).last.split("/").first if f.include?(k)
150
+ if f.include?(k)
151
+ key = f.split(k).last.split("/").first
152
+ else
153
+ key = f.split('/gems/').last.split("/").first
154
+ end
155
+ PluginRoutes.plugin_info(key)['key'] rescue raise("Not found plugin with key: #{key} or dirname: #{key}")
154
156
  end
155
157
 
156
158
  # method called only from files within plugins directory
@@ -13,7 +13,7 @@ module CamaleonCms::SiteHelper
13
13
  return $current_site if defined?($current_site)
14
14
  return @current_site if defined?(@current_site)
15
15
  if PluginRoutes.get_sites.size == 1
16
- site = CamaleonCms::Site.first.decorate
16
+ site = CamaleonCms::Site.first.decorate rescue nil
17
17
  else
18
18
  host = [request.original_url.to_s.parse_domain]
19
19
  host << request.subdomain if request.subdomain.present?
@@ -95,23 +95,4 @@ module CamaleonCms::SiteHelper
95
95
  hook_run(theme, "on_inactive", theme_model) if theme_model.present?
96
96
  # theme_model.destroy
97
97
  end
98
-
99
-
100
- # load all custom models customized by plugins or templates in custom_models.rb
101
- def site_load_custom_models(site)
102
- PluginRoutes.enabled_apps(site).each{ |app|
103
- next if !app.present? || !app["path"].present?
104
- s = File.join(app["path"], "config", "custom_models.rb")
105
- eval(File.read(s)) if File.exist?(s)
106
- }
107
- end
108
-
109
- #################### ONLY FOR CONSOLE ####################
110
- # switch console sessions and redefine current for the console session
111
- # site: Site model used as current site
112
- # return nil
113
- def site_console_switch(site = nil)
114
- $current_site = site
115
- site_load_custom_models($current_site)
116
- end
117
98
  end
@@ -14,7 +14,7 @@ module CamaleonCms::ThemeHelper
14
14
  # return theme full asset path
15
15
  # theme_name: theme name, if nil, then will use current theme
16
16
  # asset: asset file name, if asset is present return full path to this asset
17
- # sample: <script src="<%= theme_asset_path("js/admin.js") %>"></script> => return: /assets/themes/my_theme/assets/css/main-54505620f.css
17
+ # sample: <script src="<%= theme_asset_path("js/admin.js") %>"></script> => return: /assets/themes/my_theme/assets/js/admin-54505620f.js
18
18
  def theme_asset_path(asset = nil, theme_name = nil)
19
19
  if theme_name.present? && theme_name.include?("/")
20
20
  return theme_asset_url(theme_name, current_theme.slug)
@@ -18,7 +18,8 @@ module CamaleonCms::UploaderHelper
18
18
  # formats: extensions permitted, sample: jpg,png,... or generic: images | videos | audios | documents (default *)
19
19
  # remove_source: Boolean (delete source file after saved if this is true, default false)
20
20
  # same_name: Boolean (save the file with the same name if defined true, else search for a non used name)
21
- # versions: String (Create multiple versions of the image uploaded), sample: '300x300,505x350' ==> Will create two extra file with this dimensions
21
+ # versions: (String) Create addtional multiple versions of the image uploaded, sample: '300x300,505x350' ==> Will create two extra images with these dimensions
22
+ # sample "test.png", versions: '200x200,450x450' will generate: thumb/test-png_200x200.png, test-png_450x450.png
22
23
  # thumb_size: String (redefine the dimensions of the thumbnail, sample: '100x100' ==> only for images)
23
24
  # temporal_time: if great than 0 seconds, then this file will expire (removed) in that time (default: 0)
24
25
  # To manage jobs, please check http://edgeguides.rubyonrails.org/active_job_basics.html
@@ -26,9 +27,17 @@ module CamaleonCms::UploaderHelper
26
27
  # sample: upload_file(params[:my_file], {formats: "images", folder: "temporal"})
27
28
  # sample: upload_file(params[:my_file], {formats: "jpg,png,gif,mp3,mp4", temporal_time: 10.minutes, maximum: 10.megabytes})
28
29
  def upload_file(uploaded_io, settings = {})
30
+ cached_name = uploaded_io.is_a?(ActionDispatch::Http::UploadedFile) ? uploaded_io.original_filename : nil
29
31
  return {error: "File is empty", file: nil, size: nil} unless uploaded_io.present?
32
+ if uploaded_io.is_a?(String) && (uploaded_io.start_with?("http://") || uploaded_io.start_with?("https://")) # download url file
33
+ tmp = cama_tmp_upload(uploaded_io)
34
+ return tmp if tmp[:error].present?
35
+ settings[:remove_source] = true
36
+ uploaded_io = tmp[:file_path]
37
+ end
30
38
  uploaded_io = File.open(uploaded_io) if uploaded_io.is_a?(String)
31
39
  uploaded_io = File.open(cama_resize_upload(uploaded_io.path, settings[:dimension])) if settings[:dimension].present? # resize file into specific dimensions
40
+
32
41
  settings = settings.to_sym
33
42
  settings[:uploaded_io] = uploaded_io
34
43
  settings = {
@@ -37,7 +46,7 @@ module CamaleonCms::UploaderHelper
37
46
  formats: "*",
38
47
  generate_thumb: true,
39
48
  temporal_time: 0,
40
- filename: (uploaded_io.original_filename rescue uploaded_io.path.split("/").last).parameterize(".").downcase.gsub(" ", "-"),
49
+ filename: ((cached_name || uploaded_io.original_filename) rescue uploaded_io.path.split("/").last).parameterize(".").downcase.gsub(" ", "-"),
41
50
  file_size: File.size(uploaded_io.to_io),
42
51
  remove_source: false,
43
52
  same_name: false,
@@ -55,7 +64,6 @@ module CamaleonCms::UploaderHelper
55
64
  res[:error] = "#{ct("file_size_exceeded", default: "File size exceeded")} (#{number_to_human_size(settings[:maximum])})"
56
65
  return res
57
66
  end
58
-
59
67
  # save file
60
68
  key = File.join(settings[:folder], settings[:filename]).to_s.gsub(/(\/){2,}/, "/")
61
69
  res = cama_uploader.add_file(uploaded_io, key, {same_name: settings[:same_name]})
@@ -206,26 +214,23 @@ module CamaleonCms::UploaderHelper
206
214
  # name: to indicate the name to use, sample: cama_tmp_upload('/var/www/media/132/logo 2.png', {name: 'owen.png', formats: 'images'})
207
215
  # formats: extensions permitted, sample: jpg,png,... or generic: images | videos | audios | documents (default *)
208
216
  # dimension: 20x30
217
+ # return: {file_path, error}
209
218
  def cama_tmp_upload(uploaded_io, args = {})
210
219
  tmp_path = args[:path] || Rails.public_path.join("tmp", current_site.id.to_s)
211
220
  FileUtils.mkdir_p(tmp_path) unless Dir.exist?(tmp_path)
212
221
  if uploaded_io.is_a?(String) && (uploaded_io.start_with?("http://") || uploaded_io.start_with?("https://"))
213
222
  return {error: "#{ct("file_format_error")} (#{args[:formats]})"} unless cama_uploader.class.validate_file_format(uploaded_io, args[:formats])
214
- uploaded_io = Rails.public_path.join(uploaded_io.sub(current_site.the_url, '')).to_s if uploaded_io.include?(current_site.the_url) # local file
215
- name = args[:name] || uploaded_io.split("/").last.split('?').first
216
- name = "#{File.basename(name, File.extname(name)).underscore}#{File.extname(name)}"
217
- path = uploader_verify_name( File.join(tmp_path, name))
218
- File.open(path, 'wb'){|file| file.write(open(uploaded_io).read) }
219
- path = cama_resize_upload(path, args[:dimension]) if args[:dimension].present?
220
- else
221
- uploaded_io = File.open(uploaded_io) if uploaded_io.is_a?(String)
222
- return {error: "#{ct("file_format_error")} (#{args[:formats]})"} unless cama_uploader.class.validate_file_format(uploaded_io.path, args[:formats])
223
- name = args[:name] || uploaded_io.path.split("/").last
224
- name = "#{File.basename(name, File.extname(name)).underscore}#{File.extname(name)}"
225
- path = uploader_verify_name( File.join(tmp_path, name))
226
- File.open(path, "wb"){|f| f.write(uploaded_io.read) }
227
- path = cama_resize_upload(path, args[:dimension]) if args[:dimension].present?
223
+ uploaded_io = Rails.public_path.join(uploaded_io.sub(current_site.the_url, '')).to_s if uploaded_io.include?(current_site.the_url) && Rails.env != 'production' # local file
224
+ _tmp_name = uploaded_io.split("/").last.split('?').first; args[:name] = args[:name] || _tmp_name
225
+ uploaded_io = open(uploaded_io)
228
226
  end
227
+ uploaded_io = File.open(uploaded_io) if uploaded_io.is_a?(String)
228
+ return {error: "#{ct("file_format_error")} (#{args[:formats]})"} unless cama_uploader.class.validate_file_format(_tmp_name || uploaded_io.path, args[:formats])
229
+ return {error: "#{ct("file_size_exceeded", default: "File size exceeded")} (#{number_to_human_size(args[:maximum])})"} if args[:maximum].present? && args[:maximum] < (uploaded_io.size rescue File.size(uploaded_io))
230
+ name = args[:name] || uploaded_io.path.split("/").last; name = "#{File.basename(name, File.extname(name)).underscore}#{File.extname(name)}"
231
+ path = uploader_verify_name(File.join(tmp_path, name))
232
+ File.open(path, "wb"){|f| f.write(uploaded_io.read) }
233
+ path = cama_resize_upload(path, args[:dimension]) if args[:dimension].present?
229
234
  {file_path: path, error: nil}
230
235
  end
231
236
 
@@ -245,13 +250,13 @@ module CamaleonCms::UploaderHelper
245
250
 
246
251
  # return the current uploader
247
252
  def cama_uploader
253
+ @cama_uploader ||=
248
254
  case current_site.get_option("filesystem_type", "local").downcase
249
255
  when 's3' || 'aws'
250
- @cama_uploader ||= CamaleonCmsAwsUploader.new({current_site: current_site})
256
+ CamaleonCmsAwsUploader.new({current_site: current_site})
251
257
  else
252
- @cama_uploader ||= CamaleonCmsLocalUploader.new({current_site: current_site})
258
+ CamaleonCmsLocalUploader.new({current_site: current_site})
253
259
  end
254
- @cama_uploader
255
260
  end
256
261
 
257
262
  private
@@ -9,6 +9,11 @@
9
9
  #encoding: utf-8
10
10
  module CamaleonCms::UserRolesHelper
11
11
  def cama_get_roles_values
12
- CamaleonCms::UserRole::ROLES
12
+ roles_list = CamaleonCms::UserRole::ROLES
13
+ # permit to add custom roles to be listed in editing roles form
14
+ # sample: args[:roles_list][:manager] << { key: 'my_role_key', label: "my_custom_permission", description: "lorem ipsum"}
15
+ # authorize! :manage, :my_role_key
16
+ args = {roles_list: roles_list}; hooks_run("available_user_roles_list", args)
17
+ args[:roles_list]
13
18
  end
14
19
  end
@@ -49,7 +49,8 @@ class CamaleonCms::HtmlMailer < ActionMailer::Base
49
49
  theme = current_site.get_theme
50
50
  lookup_context.prefixes.prepend("themes/#{theme.slug}") if theme.settings["gem_mode"]
51
51
  lookup_context.prefixes.prepend("themes/#{theme.slug}/views") unless theme.settings["gem_mode"]
52
- (data[:files] || data[:attachments] || []).each { |attach| attachments["#{File.basename(attach)}"] = File.open(attach, 'rb') { |f| f.read } }
52
+ lookup_context.use_camaleon_partial_prefixes = true
53
+ (data[:files] || data[:attachments] || []).each{ |attach| attachments["#{File.basename(attach)}"] = File.open(attach, 'rb') { |f| f.read } if File.exist?(attach) }
53
54
 
54
55
  layout = data[:layout_name].present? ? data[:layout_name] : false
55
56
  if data[:template_name].present? # render email with template
@@ -77,33 +77,10 @@ class CamaleonCms::Ability
77
77
  can :manage, :plugins if @roles_manager[:plugins] rescue false
78
78
  can :manage, :users if @roles_manager[:users] rescue false
79
79
  can :manage, :settings if @roles_manager[:settings] rescue false
80
-
81
-
80
+ @roles_manager.each do |rol_manage_key, val_role|
81
+ can :manage, rol_manage_key.to_sym if val_role.to_s.cama_true? rescue false
82
+ end
82
83
  end
83
-
84
-
85
- # variants:
86
-
87
- # can [:update, :destroy], [Article, Comment]
88
-
89
- #alias_action :create, :read, :update, :destroy, :to => :crud
90
- # can :crud, User
91
-
92
- # can :invite, User
93
-
94
- # can :read, Project, :priority => 1..3
95
-
96
- # conditions:
97
- # can :read, Project, :active => true, :user_id => user.id
98
- # can :read, Project, :category => { :visible => true }
99
- # can :manage, Project, :group => { :id => user.group_ids }
100
- # can :read, Photo, Photo.scope_defined do |photo|
101
- # photo.groups.empty?
102
- # end
103
-
104
-
105
- # See the wiki for details:
106
- # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
107
84
  end
108
85
 
109
86
  #overwrite can method to support decorator class names
@@ -18,6 +18,8 @@ class CamaleonCms::CustomField < ActiveRecord::Base
18
18
  has_many :values, :class_name => "CamaleonCms::CustomFieldsRelationship", :foreign_key => :custom_field_id, dependent: :destroy
19
19
  belongs_to :custom_field_group, class_name: "CamaleonCms::CustomFieldGroup"
20
20
  belongs_to :parent, class_name: "CamaleonCms::CustomField", :foreign_key => :parent_id
21
+ alias_attribute :label, :name
22
+ validates_uniqueness_of :slug, scope: [:parent_id, :object_class]
21
23
 
22
24
  scope :configuration, -> {where(parent_id: -1)}
23
25
  scope :visible_group, -> {where(status: nil)}
@@ -29,5 +31,4 @@ class CamaleonCms::CustomField < ActiveRecord::Base
29
31
  self.slug = self.name if self.slug.blank?
30
32
  self.slug = self.slug.to_s.parameterize
31
33
  end
32
-
33
34
  end
@@ -15,28 +15,27 @@ class CamaleonCms::CustomFieldGroup < CamaleonCms::CustomField
15
15
  has_many :metas, ->{ where(object_class: 'CustomFieldGroup')}, :class_name => "CamaleonCms::Meta", foreign_key: :objectid, dependent: :destroy
16
16
  has_many :fields, -> {where(object_class: '_fields')}, :class_name => "CamaleonCms::CustomField", foreign_key: :parent_id, dependent: :destroy
17
17
  belongs_to :site, :class_name => "CamaleonCms::Site", foreign_key: :parent_id
18
+ validates_uniqueness_of :slug, scope: [:object_class, :objectid]
18
19
  before_validation :before_validating
19
20
 
20
- # ------------------- fields -----------------
21
21
  # add fields to group
22
22
  # item:
23
23
  # - sample: {"name"=>"Label", "slug"=>"my_slug", "description"=>"my description (optional)"}
24
24
  # - options (textbox sample): {"field_key":"text_box","multiple":"1","required":"1","translate":"1"}
25
-
26
- # check all options for each case in Admin::CustomFieldsHelper
27
- # for select, radio and checkboxes add:
28
- # -- multiple_options: [{"title"=>"Option Title", "value"=>"2", "default"=>"1"}, {"title"=>"abcde", "value"=>"3"}]
29
- # -- add default for default value
30
- # -- label_eval: (Boolean, default false), true => will evaluate the label and description of current field using (eval('my_label')) to have translatable|dynamic labels
25
+ # * field_key (string) | translate (boolean) | default_value (unique value) | default_values (array - multiple values for this field) | label_eval (boolean) | multiple_options (array)
26
+ # * multiple_options (used for select, radio and checkboxes ): [{"title"=>"Option Title", "value"=>"2", "default"=>"1"}, {"title"=>"abcde", "value"=>"3"}]
27
+ # * label_eval: (Boolean, default false), true => will evaluate the label and description of current field using (eval('my_label')) to have translatable|dynamic labels
28
+ #****** check all options for each case in Admin::CustomFieldsHelper ****
31
29
  # SAMPLE: my_model.add_field({"name"=>"Sub Title", "slug"=>"subtitle"}, {"field_key"=>"text_box", "translate"=>true, default_value: "Get in Touch"})
32
-
33
30
  def add_manual_field(item, options)
34
31
  c = get_field(item[:slug] || item["slug"])
35
32
  return c if c.present?
36
33
 
37
- field_item = self.fields.create!(item)
38
- field_item.set_options(options)
39
- auto_save_default_values(field_item, options)
34
+ field_item = self.fields.new(item)
35
+ if field_item.save
36
+ field_item.set_options(options)
37
+ auto_save_default_values(field_item, options)
38
+ end
40
39
  field_item
41
40
  end
42
41
  alias_method :add_field, :add_manual_field
@@ -47,31 +46,31 @@ class CamaleonCms::CustomFieldGroup < CamaleonCms::CustomField
47
46
  end
48
47
 
49
48
  # only used by form on admin panel (protected)
49
+ # return array of failed_fields and full_fields [[failed fields], [all fields]]
50
50
  def add_fields(items, item_options)
51
- ids_old = self.fields.pluck("#{CamaleonCms::CustomField.table_name}.id")
52
- ids_saved = []
53
- order_index = 0
51
+ self.fields.where.not(id: items.map{|k, obj| obj['id'] }.uniq).destroy_all
52
+ cache_fields, order_index, errors_saved = [], 0, []
54
53
  if items.present?
55
54
  items.each do |i,item|
56
55
  item[:field_order] = order_index
57
56
  options = item_options[i] || {}
58
- if item[:id].present?
59
- field_item = self.fields.find(item[:id])
57
+ if item[:id].present? && (field_item = self.fields.where(id: item[:id]).first).present?
60
58
  saved = field_item.update(item)
59
+ cache_fields << field_item
61
60
  else
62
61
  field_item = self.fields.new(item)
62
+ cache_fields << field_item
63
63
  saved = field_item.save
64
64
  auto_save_default_values(field_item, options) if saved
65
+ errors_saved << field_item unless saved
65
66
  end
66
67
  if saved
67
68
  field_item.set_meta('_default', options)
68
- ids_saved << field_item.id
69
69
  order_index += 1
70
70
  end
71
71
  end
72
72
  end
73
- ids_deletes = ids_old - ids_saved
74
- self.fields.where(id: ids_deletes).destroy_all if ids_deletes.any?
73
+ [errors_saved, cache_fields]
75
74
  end
76
75
 
77
76
  # generate the caption for this group
@@ -112,17 +111,19 @@ class CamaleonCms::CustomFieldGroup < CamaleonCms::CustomField
112
111
  self.slug = "_group-#{self.name.to_s.parameterize}" unless self.slug.present?
113
112
  end
114
113
 
115
- # TODO VERIFY CLASS NAME
116
114
  # auto save the default field values
117
115
  def auto_save_default_values(field, options)
116
+ options = options.with_indifferent_access
118
117
  class_name = self.object_class.split("_").first
119
- if ["Post", "Category", "Plugin", "Theme"].include?(class_name) && self.objectid.present? && options[:default_value].present?
118
+ if ["Post", "Category", "Plugin", "Theme"].include?(class_name) && self.objectid.present? && (options[:default_value].present? || options[:default_values].present?)
120
119
  if class_name == "Theme"
121
120
  owner = "CamaleonCms::#{class_name}".constantize.where(id: self.objectid).first # owner model
122
121
  else
123
122
  owner = "CamaleonCms::#{class_name}".constantize.find(self.objectid) rescue "CamaleonCms::#{class_name}".constantize.where(slug: self.objectid).first # owner model
124
123
  end
125
- owner.field_values.create!({custom_field_id: field.id, custom_field_slug: field.slug, value: fix_meta_value(options["default_value"]||options[:default_value])}) if owner.present?
124
+ (options[:default_values] || [options[:default_value]] || []).each do |value|
125
+ owner.field_values.create!({custom_field_id: field.id, custom_field_slug: field.slug, value: fix_meta_value(value)}) if owner.present?
126
+ end
126
127
  end
127
128
  end
128
129
  end
@@ -8,7 +8,7 @@
8
8
  =end
9
9
  class CamaleonCms::CustomFieldsRelationship < ActiveRecord::Base
10
10
  self.table_name = "#{PluginRoutes.static_system_info["db_prefix"]}custom_fields_relationships"
11
- attr_accessible :objectid, :custom_field_id, :term_order, :value, :object_class, :custom_field_slug
11
+ attr_accessible :objectid, :custom_field_id, :term_order, :value, :object_class, :custom_field_slug, :group_number
12
12
  default_scope {order("#{CamaleonCms::CustomFieldsRelationship.table_name}.term_order ASC")}
13
13
  # relations
14
14
  belongs_to :custom_fields, :class_name => "CamaleonCms::CustomField", foreign_key: :custom_field_id