camaleon_cms 2.4.5.5 → 2.4.5.7
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.
- checksums.yaml +4 -4
- data/app/apps/themes/default/views/partials/_comments.html.erb +36 -21
- data/app/apps/themes/default/views/post.html.erb +1 -1
- data/app/assets/javascripts/camaleon_cms/admin/uploader/_media_manager.js.coffee +4 -4
- data/app/controllers/camaleon_cms/admin/categories_controller.rb +3 -0
- data/app/controllers/camaleon_cms/admin/media_controller.rb +9 -6
- data/app/controllers/camaleon_cms/admin/sessions_controller.rb +1 -1
- data/app/controllers/camaleon_cms/admin/settings/post_types_controller.rb +2 -0
- data/app/controllers/concerns/camaleon_cms/frontend_concern.rb +17 -13
- data/app/decorators/camaleon_cms/post_decorator.rb +0 -1
- data/app/helpers/camaleon_cms/captcha_helper.rb +1 -1
- data/app/helpers/camaleon_cms/frontend/nav_menu_helper.rb +1 -0
- data/app/helpers/camaleon_cms/hooks_helper.rb +6 -1
- data/app/helpers/camaleon_cms/site_helper.rb +1 -1
- data/app/helpers/camaleon_cms/uploader_helper.rb +36 -27
- data/app/models/camaleon_cms/custom_fields_relationship.rb +6 -0
- data/app/models/camaleon_cms/media.rb +54 -0
- data/app/models/camaleon_cms/post.rb +1 -0
- data/app/models/camaleon_cms/site.rb +7 -0
- data/app/uploaders/camaleon_cms_aws_uploader.rb +21 -23
- data/app/uploaders/camaleon_cms_local_uploader.rb +20 -26
- data/app/uploaders/camaleon_cms_uploader.rb +17 -45
- data/app/views/camaleon_cms/admin/categories/index.html.erb +2 -2
- data/app/views/camaleon_cms/admin/media/_render_file_item.html.erb +53 -36
- data/app/views/camaleon_cms/admin/media/index.html.erb +1 -1
- data/app/views/camaleon_cms/admin/post_tags/index.html.erb +4 -4
- data/app/views/camaleon_cms/admin/posts/index.html.erb +1 -0
- data/app/views/camaleon_cms/admin/settings/_configuration_settings.html.erb +5 -1
- data/app/views/camaleon_cms/admin/settings/post_types/_form.html.erb +1 -1
- data/app/views/camaleon_cms/default_theme/partials/_comments.html.erb +45 -28
- data/app/views/camaleon_cms/default_theme/single.html.erb +1 -1
- data/config/locales/camaleon_cms/admin/es.yml +1 -0
- data/config/locales/camaleon_cms/admin/js.yml +54 -3
- data/config/locales/camaleon_cms/admin/ru.yml +39 -28
- data/db/migrate/20180124132318_create_media.rb +17 -0
- data/lib/camaleon_cms/version.rb +1 -1
- data/lib/ext/string.rb +8 -0
- data/lib/generators/camaleon_cms/gem_plugin_generator.rb +29 -25
- data/lib/plugin_routes.rb +27 -0
- data/spec/dummy/config/application.rb +1 -0
- data/spec/dummy/config/environments/test.rb +2 -0
- data/spec/dummy/db/schema.rb +1 -140
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/post_type.rb +17 -0
- data/spec/factories/site.rb +8 -0
- data/spec/features/{categories_spec.rb → admin/categories_spec.rb} +1 -1
- data/spec/features/{comments_spec.rb → admin/comments_spec.rb} +16 -9
- data/spec/features/{contact_form_spec.rb → admin/contact_form_spec.rb} +16 -9
- data/spec/features/{content_groups_spec.rb → admin/content_groups_spec.rb} +19 -11
- data/spec/features/{custom_fields_spec.rb → admin/custom_fields_spec.rb} +1 -1
- data/spec/features/{languages_spec.rb → admin/languages_spec.rb} +1 -1
- data/spec/features/{media_spec.rb → admin/media_spec.rb} +1 -1
- data/spec/features/{menus_spec.rb → admin/menus_spec.rb} +2 -2
- data/spec/features/{pages_spec.rb → admin/pages_spec.rb} +1 -1
- data/spec/features/{plugins_spec.rb → admin/plugins_spec.rb} +1 -1
- data/spec/features/{posts_spec.rb → admin/posts_spec.rb} +4 -3
- data/spec/features/admin/session_spec.rb +102 -0
- data/spec/features/{settings_spec.rb → admin/settings_spec.rb} +1 -1
- data/spec/features/{shortcodes_spec.rb → admin/shortcodes_spec.rb} +1 -1
- data/spec/features/{sites_spec.rb → admin/sites_spec.rb} +22 -14
- data/spec/features/{tags_spec.rb → admin/tags_spec.rb} +17 -8
- data/spec/features/{themes_spec.rb → admin/themes_spec.rb} +1 -1
- data/spec/features/{user_roles_spec.rb → admin/user_roles_spec.rb} +25 -19
- data/spec/features/{users_spec.rb → admin/users_spec.rb} +2 -2
- data/spec/features/{widgets_spec.rb → admin/widgets_spec.rb} +19 -12
- data/spec/features/frontend/pages_spec.rb +86 -5
- data/spec/features/frontend/post_type_spec.rb +16 -0
- data/spec/helpers/email_helper_spec.rb +1 -1
- data/spec/helpers/uploader_helper_spec.rb +56 -0
- data/spec/mailers/send_mail_spec.rb +3 -3
- data/spec/{decorators/camaleon_cms/post_decorator_spec.rb → models/post_spec.rb} +3 -3
- data/spec/rails_helper.rb +79 -0
- data/spec/spec_helper.rb +25 -56
- data/spec/support/common.rb +10 -24
- data/spec/support/fixtures/rails.png +0 -0
- data/spec/support/fixtures/rails_tmp.png +0 -0
- metadata +64 -50
- data/app/views/camaleon_cms/admin/media/_files_list.html.erb +0 -2
- data/app/views/camaleon_cms/admin/media/_render_folder_item.html.erb +0 -15
- data/spec/decorators/post_type_spec.rb +0 -13
- data/spec/features/session_spec.rb +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c40d70430d7edd9132d9ed5529735b8421054db1
|
4
|
+
data.tar.gz: f34b54e713ca8a1d88a8de55e1cd3b5d048cc08b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bdd8d1ce6f4a4ceaddd893c5ca4cf4d478ca3f5ede911b4cf86935ab39fcf6637abd300073a69dd194666366c90e2919bf65fabdba7fe21771e3b159bb68eb9
|
7
|
+
data.tar.gz: f6c8551c32f86b304a0b328b725b5bb0efcd9546784b56151ebe70aaaaaaf5e2ec62b1d0f2b7183f48e4593504bac472be12418796f2c940f162a4e6a67833f7
|
@@ -1,25 +1,40 @@
|
|
1
1
|
<section id="comments" class="comments-area">
|
2
|
-
|
3
|
-
|
4
|
-
<
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
<% if post.the_comments.count > 0 %>
|
3
|
+
<h2 class="comments-title"><%= post.the_comments.count %> <%= ct('comments', default: 'Comments') %>
|
4
|
+
"<span><%= post.the_title %></span>"</h2>
|
5
|
+
<section class="comment-list">
|
6
|
+
<%= render partial: "partials/comments_list", locals: {comments: post.the_comments, children: ""} %>
|
7
|
+
</section>
|
8
|
+
<% end %>
|
9
|
+
<% if post.can_commented? %>
|
8
10
|
<div id="respond" class="comment-respond">
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
11
|
+
<h3><%= ct('comment_new', default: 'New Comment') %></h3>
|
12
|
+
<% if signin? || current_site.get_option('permit_anonimos_comment', false) %>
|
13
|
+
<%= form_for post, url: {action: :save_comment, post_id: post.id}, html: {method: "post", class: "form-comment comment-form", id: 'form-comment'} do |f| %>
|
14
|
+
<%= render partial: "camaleon_cms/flash_messages", locals: {flash: (flash[:comment_submit] || {}).with_indifferent_access} %>
|
15
|
+
<% unless signin? %>
|
16
|
+
<div class="form-group">
|
17
|
+
<%= text_field_tag 'post_comment[name]', '', class: 'form-control required', placeholder: t('.anonymous_name', default: 'Name') %>
|
18
|
+
</div>
|
19
|
+
<div class="form-group">
|
20
|
+
<%= email_field_tag 'post_comment[email]', '', class: 'form-control required', placeholder: t('.anonymous_email', default: 'Email') %>
|
21
|
+
</div>
|
22
|
+
<% if current_site.is_enable_captcha_for_comments? %>
|
23
|
+
<%= content_tag :div, raw(cama_captcha_tag), class: 'form-group' %>
|
24
|
+
<% end %>
|
25
|
+
<% end %>
|
26
|
+
<div class="form-group">
|
27
|
+
<%= text_area_tag 'post_comment[content]', '', class: 'form-control required counted', placeholder: ct('comment', default: 'Here your comment') %>
|
28
|
+
</div>
|
29
|
+
<div class="form-group text-right">
|
30
|
+
<button type="submit" class="btn btn-info"><%= ct('comment', default: 'Comment') %></button>
|
31
|
+
</div>
|
32
|
+
<% end %>
|
33
|
+
<% else %>
|
34
|
+
<div class="panel-login-comment"><%= ct('comment_msg', default: 'You must be logged in to post a comment') %>
|
35
|
+
<a class="link-login-comment" href="<%= cama_admin_path %>"><%= ct('login', default: 'Login') %></a>
|
36
|
+
</div>
|
37
|
+
<% end %>
|
24
38
|
</div>
|
39
|
+
<% end %>
|
25
40
|
</section>
|
@@ -20,18 +20,18 @@ window["cama_init_media"] = (media_panel) ->
|
|
20
20
|
"<div class='p_label'><b>"+I18n("button.name")+": </b><br> <span>"+data["name"]+"</span></div>" +
|
21
21
|
"<div class='p_body'>" +
|
22
22
|
"<div style='overflow: auto;'><b>"+I18n("button.url")+":</b><br> <a target='_blank' href='"+data["url"]+"'>"+data["url"]+"</a></div>" +
|
23
|
-
"<div><b>"+I18n("button.size")+":</b> <span>"+cama_humanFileSize(data["
|
23
|
+
"<div><b>"+I18n("button.size")+":</b> <span>"+cama_humanFileSize(parseFloat(data["file_size"]))+"</span></div>" +
|
24
24
|
"</div>"
|
25
25
|
|
26
26
|
if window["callback_media_uploader"]
|
27
|
-
if !media_panel.attr("data-formats") || (media_panel.attr("data-formats") && ($.inArray(data["
|
27
|
+
if !media_panel.attr("data-formats") || (media_panel.attr("data-formats") && ($.inArray(data["file_type"], media_panel.attr("data-formats").split(",")) >= 0 || $.inArray(data["url"].split(".").pop().toLowerCase(), media_panel.attr("data-formats").split(",")) >= 0))
|
28
28
|
tpl += "<div class='p_footer'>" +
|
29
29
|
"<button class='btn btn-primary insert_btn'>"+I18n("button.insert")+"</button>" +
|
30
30
|
"</div>"
|
31
31
|
|
32
32
|
media_info.html(tpl)
|
33
33
|
media_info.find(".p_thumb").html(item.find(".thumb").html())
|
34
|
-
if data["
|
34
|
+
if data["file_type"] == "image"
|
35
35
|
if item.find('.edit_item') # add button to edit image
|
36
36
|
edit_img = $('<button type="button" class="pull-right btn btn-default" title="Edit"><i class="fa fa-pencil"></i></button>').click ->
|
37
37
|
item.find('.edit_item').trigger('click')
|
@@ -351,7 +351,7 @@ window["cama_init_media"] = (media_panel) ->
|
|
351
351
|
title: I18n('button.edit_image', 'Edit Image')+' - ' + data['name'] + (if media_panel.attr("data-dimension") then " <small><i>("+media_panel.attr("data-dimension")+")</i></small>" else ''),
|
352
352
|
content: '<div>' +
|
353
353
|
'<div class="editable_wrapper">' +
|
354
|
-
'<img style="max-width: 100%;" class="editable" id="media_editable_image" src="'+data['url']+'">' +
|
354
|
+
'<img style="max-width: 100%;" class="editable" id="media_editable_image" crossorigin src="'+data['url']+'">' +
|
355
355
|
'</div>' +
|
356
356
|
'<div class="row" style="margin-top: 5px;">' +
|
357
357
|
'<div class="col-md-8">' +
|
@@ -32,9 +32,12 @@ class CamaleonCms::Admin::CategoriesController < CamaleonCms::AdminController
|
|
32
32
|
|
33
33
|
def create
|
34
34
|
@category = @post_type.categories.new(params.require(:category).permit!)
|
35
|
+
hooks_run("create_category", {category: @category, post_type: @post_type})
|
36
|
+
|
35
37
|
if @category.save
|
36
38
|
@category.set_options(params[:meta])
|
37
39
|
@category.set_field_values(params[:field_options])
|
40
|
+
hooks_run("created_category", {category: @category, post_type: @post_type})
|
38
41
|
flash[:notice] = t('camaleon_cms.admin.post_type.message.created')
|
39
42
|
redirect_to action: :index
|
40
43
|
else
|
@@ -8,7 +8,7 @@ class CamaleonCms::Admin::MediaController < CamaleonCms::AdminController
|
|
8
8
|
def index
|
9
9
|
authorize! :manage, :media
|
10
10
|
@show_file_actions = true
|
11
|
-
@files = @tree
|
11
|
+
@files = @tree.paginate(page: params[:page], per_page: 100)
|
12
12
|
@next_page = @files.current_page < @files.total_pages ? @files.current_page + 1 : nil
|
13
13
|
add_breadcrumb I18n.t("camaleon_cms.admin.sidebar.media")
|
14
14
|
end
|
@@ -38,10 +38,10 @@ class CamaleonCms::Admin::MediaController < CamaleonCms::AdminController
|
|
38
38
|
@show_file_actions = true
|
39
39
|
end
|
40
40
|
@tree = cama_uploader.search(params[:search]) if params[:search].present?
|
41
|
-
@files = @tree
|
41
|
+
@files = @tree.paginate(page: params[:page], per_page: 100)
|
42
42
|
@next_page = @files.current_page < @files.total_pages ? @files.current_page + 1 : nil
|
43
43
|
if params[:partial].present?
|
44
|
-
render json: {next_page: @next_page, html: render_to_string(partial: "
|
44
|
+
render json: {next_page: @next_page, html: render_to_string(partial: "render_file_item", locals: { files: @files })}
|
45
45
|
else
|
46
46
|
render "index", layout: false unless params[:partial].present?
|
47
47
|
end
|
@@ -56,7 +56,7 @@ class CamaleonCms::Admin::MediaController < CamaleonCms::AdminController
|
|
56
56
|
case params[:media_action]
|
57
57
|
when "new_folder"
|
58
58
|
params[:folder] = slugify_folder(params[:folder])
|
59
|
-
render partial: "
|
59
|
+
render partial: "render_file_item", locals: {files: [cama_uploader.add_folder(params[:folder])]}
|
60
60
|
when "del_folder"
|
61
61
|
cama_uploader.delete_folder(params[:folder])
|
62
62
|
render inline: ""
|
@@ -64,7 +64,9 @@ class CamaleonCms::Admin::MediaController < CamaleonCms::AdminController
|
|
64
64
|
cama_uploader.delete_file(params[:folder].gsub("//", "/"))
|
65
65
|
render inline: ""
|
66
66
|
when 'crop_url'
|
67
|
-
|
67
|
+
unless params[:url].start_with?('data:')
|
68
|
+
params[:url] = (params[:url].start_with?('http') ? '' : current_site.the_url(locale: nil)) + params[:url]
|
69
|
+
end
|
68
70
|
r = cama_tmp_upload( params[:url], formats: params[:formats], name: params[:name])
|
69
71
|
unless r[:error].present?
|
70
72
|
params[:file_upload] = r[:file_path]
|
@@ -93,7 +95,8 @@ class CamaleonCms::Admin::MediaController < CamaleonCms::AdminController
|
|
93
95
|
# init basic media variables
|
94
96
|
def init_media_vars
|
95
97
|
@cama_uploader = CamaleonCmsLocalUploader.new({current_site: current_site, private: true}) if params[:private].present?
|
96
|
-
cama_uploader.clear_cache if params[:cama_media_reload]
|
98
|
+
cama_uploader.clear_cache if params[:cama_media_reload] == 'clear_cache'
|
99
|
+
cama_uploader.reload if params[:cama_media_reload] == 'reload'
|
97
100
|
@media_formats = (params[:media_formats] || "").sub("media", ",video,audio").sub("all", "").split(",")
|
98
101
|
@tree = cama_uploader.objects(@folder = params[:folder] || "/")
|
99
102
|
@show_file_actions ||= params[:actions].to_s == 'true'
|
@@ -112,7 +112,7 @@ class CamaleonCms::Admin::SessionsController < CamaleonCms::CamaleonController
|
|
112
112
|
user_data = user_permit_data
|
113
113
|
result = cama_register_user(user_data, params[:meta])
|
114
114
|
if result[:result] == false && result[:type] == :captcha_error
|
115
|
-
@user.errors
|
115
|
+
@user.errors.add(:captcha, t('camaleon_cms.admin.users.message.error_captcha'))
|
116
116
|
render 'register'
|
117
117
|
elsif result[:result]
|
118
118
|
flash[:notice] = result[:message]
|
@@ -19,6 +19,7 @@ class CamaleonCms::Admin::Settings::PostTypesController < CamaleonCms::Admin::Se
|
|
19
19
|
def update
|
20
20
|
if @post_type.update(@data_term)
|
21
21
|
@post_type.set_field_values(params.require(:field_options).permit!) if params[:field_options].present?
|
22
|
+
hooks_run("updated_post_type", {post_type: @post_type})
|
22
23
|
flash[:notice] = t('camaleon_cms.admin.post_type.message.updated')
|
23
24
|
redirect_to action: :index
|
24
25
|
else
|
@@ -30,6 +31,7 @@ class CamaleonCms::Admin::Settings::PostTypesController < CamaleonCms::Admin::Se
|
|
30
31
|
@post_type = current_site.post_types.new(@data_term)
|
31
32
|
if @post_type.save
|
32
33
|
@post_type.set_field_values(params.require(:field_options).permit!) if params[:field_options].present?
|
34
|
+
hooks_run("created_post_type", {post_type: @post_type})
|
33
35
|
flash[:notice] = t('camaleon_cms.admin.post_type.message.created')
|
34
36
|
redirect_to action: :index
|
35
37
|
else
|
@@ -31,6 +31,7 @@ module CamaleonCms::FrontendConcern extend ActiveSupport::Concern
|
|
31
31
|
@post = current_site.posts.find_by_id(params[:post_id]).decorate
|
32
32
|
user = cama_current_user
|
33
33
|
comment_data = {}
|
34
|
+
flash[:comment_submit][:error] = t('.comments_not_enabled', default: 'This post can not be commented') if !@post.can_commented?
|
34
35
|
if user.present?
|
35
36
|
comment_data[:author] = user.fullname
|
36
37
|
comment_data[:author_email] = user.email
|
@@ -39,23 +40,26 @@ module CamaleonCms::FrontendConcern extend ActiveSupport::Concern
|
|
39
40
|
comment_data[:is_anonymous] = true
|
40
41
|
comment_data[:author] = params[:post_comment][:name]
|
41
42
|
comment_data[:author_email] = params[:post_comment][:email]
|
43
|
+
flash[:comment_submit][:error] = t('camaleon_cms.admin.users.message.error_captcha', default: 'Invalid captcha value') if current_site.is_enable_captcha_for_comments? && !cama_captcha_verified?
|
42
44
|
end
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
46
|
+
unless flash[:comment_submit][:error]
|
47
|
+
if user.present?
|
48
|
+
comment_data[:user_id] = user.id
|
49
|
+
comment_data[:author_url] = params[:post_comment][:url] || ""
|
50
|
+
comment_data[:author_IP] = request.remote_ip.to_s
|
51
|
+
comment_data[:approved] = current_site.front_comment_status
|
52
|
+
comment_data[:agent] = request.user_agent.force_encoding("ISO-8859-1").encode("UTF-8")
|
53
|
+
comment_data[:content] = params[:post_comment][:content]
|
54
|
+
@comment = params[:post_comment][:parent_id].present? ? @post.comments.find_by_id(params[:post_comment][:parent_id]).children.new(comment_data) : @post.comments.main.new(comment_data)
|
55
|
+
if @comment.save
|
56
|
+
flash[:comment_submit][:notice] = t('camaleon_cms.admin.comments.message.created')
|
57
|
+
else
|
58
|
+
flash[:comment_submit][:error] = "#{t('camaleon_cms.common.comment_error', default: 'An error was occurred on save comment')}:<br> #{@comment.errors.full_messages.join(', ')}"
|
59
|
+
end
|
54
60
|
else
|
55
|
-
flash[:comment_submit][:error] =
|
61
|
+
flash[:comment_submit][:error] = t('camaleon_cms.admin.message.unauthorized')
|
56
62
|
end
|
57
|
-
else
|
58
|
-
flash[:comment_submit][:error] = t('camaleon_cms.admin.message.unauthorized')
|
59
63
|
end
|
60
64
|
params[:format] == 'json' ? render(json: flash.discard(:comment_submit).to_hash) : redirect_to(request.referer || @post.the_url(as_path: true))
|
61
65
|
end
|
@@ -217,7 +217,6 @@ class CamaleonCms::PostDecorator < CamaleonCms::ApplicationDecorator
|
|
217
217
|
# @param _parent: parent decorated model, like: (PostType *default), Category, PostTag, Site
|
218
218
|
# @samples: my_post.the_next_post(), my_post.the_next_post(@category), my_post.the_next_post(current_site)
|
219
219
|
def the_next_post(_parent = nil)
|
220
|
-
puts "next for: #{object.slug}"
|
221
220
|
(_parent.presence || the_post_type).the_posts.where("#{CamaleonCms::Post.table_name}.post_order > :position OR (#{CamaleonCms::Post.table_name}.post_order = :position and #{CamaleonCms::Post.table_name}.created_at > :created_at)", {position: object.post_order, created_at: object.created_at}).where.not(id: object.id).take.try(:decorate)
|
222
221
|
end
|
223
222
|
|
@@ -34,7 +34,7 @@ module CamaleonCms::CaptchaHelper
|
|
34
34
|
|
35
35
|
# verify captcha value
|
36
36
|
def cama_captcha_verified?
|
37
|
-
(session[:cama_captcha] || []).include?((params[:cama_captcha] || params[:captcha]).to_s.upcase)
|
37
|
+
(session[:cama_captcha] || []).include?((params[:cama_captcha] || params[:captcha]).to_s.upcase)
|
38
38
|
end
|
39
39
|
|
40
40
|
#************************* captcha in attack helpers ***************************#
|
@@ -166,6 +166,7 @@ module CamaleonCms::Frontend::NavMenuHelper
|
|
166
166
|
# label => label of the link
|
167
167
|
# url: url for the link
|
168
168
|
def breadcrumb_add(label, url = "", prepend = false)
|
169
|
+
@_front_breadcrumb ||= []
|
169
170
|
if prepend
|
170
171
|
@_front_breadcrumb = @_front_breadcrumb.unshift([label, url])
|
171
172
|
else
|
@@ -18,8 +18,13 @@ module CamaleonCms::HooksHelper
|
|
18
18
|
PluginRoutes.enabled_apps(current_site).each do |plugin|
|
19
19
|
_do_hook(plugin, hook_key, params)
|
20
20
|
end
|
21
|
-
end
|
22
21
|
|
22
|
+
# call all anonymous hooks
|
23
|
+
PluginRoutes.get_anonymous_hooks(hook_key).each do |_hook|
|
24
|
+
_hook.call(params)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
23
28
|
# skip hook function with name: hook_function_name
|
24
29
|
def hook_skip(hook_function_name)
|
25
30
|
@_hooks_skip << hook_function_name
|
@@ -11,7 +11,7 @@ module CamaleonCms::SiteHelper
|
|
11
11
|
host << request.subdomain if request.subdomain.present?
|
12
12
|
site = CamaleonCms::Site.where(slug: host).first.decorate rescue nil
|
13
13
|
end
|
14
|
-
r = {site: site, request: request};
|
14
|
+
r = {site: site, request: (request rescue nil)};
|
15
15
|
cama_current_site_helper(r) rescue nil
|
16
16
|
Rails.logger.error 'Camaleon CMS - Please define your current site: $current_site = CamaleonCms::Site.first.decorate or map your domains: http://camaleon.tuzitio.com/documentation/category/139779-examples/how.html'.cama_log_style(:red) if !r[:site].present?
|
17
17
|
@current_site = r[:site]
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module CamaleonCms::UploaderHelper
|
2
2
|
include ActionView::Helpers::NumberHelper
|
3
|
+
include CamaleonCms::CamaleonHelper
|
3
4
|
# upload a file into server
|
4
5
|
# settings:
|
5
6
|
# folder: Directory where the file will be saved (default: "")
|
@@ -21,7 +22,7 @@ module CamaleonCms::UploaderHelper
|
|
21
22
|
def upload_file(uploaded_io, settings = {})
|
22
23
|
cached_name = uploaded_io.is_a?(ActionDispatch::Http::UploadedFile) ? uploaded_io.original_filename : nil
|
23
24
|
return {error: "File is empty", file: nil, size: nil} unless uploaded_io.present?
|
24
|
-
if uploaded_io.is_a?(String) &&
|
25
|
+
if uploaded_io.is_a?(String) && uploaded_io.match(/^https?:\/\//).present? # download url file
|
25
26
|
tmp = cama_tmp_upload(uploaded_io)
|
26
27
|
return tmp if tmp[:error].present?
|
27
28
|
settings[:remove_source] = true
|
@@ -58,22 +59,21 @@ module CamaleonCms::UploaderHelper
|
|
58
59
|
end
|
59
60
|
# save file
|
60
61
|
key = File.join(settings[:folder], settings[:filename]).to_s.cama_fix_slash
|
61
|
-
res = cama_uploader.add_file(uploaded_io, key, {same_name: settings[:same_name]})
|
62
|
+
res = cama_uploader.add_file(settings[:uploaded_io], key, {same_name: settings[:same_name]})
|
62
63
|
{} if settings[:temporal_time] > 0 # temporal file upload (always put as local for temporal files) (TODO: use delayjob)
|
63
64
|
|
64
65
|
# generate image versions
|
65
|
-
if res['
|
66
|
+
if res['file_type'] == 'image'
|
66
67
|
settings[:versions].to_s.gsub(' ', '').split(',').each do |v|
|
67
|
-
version_path = cama_resize_upload(uploaded_io.path, v, {replace: false})
|
68
|
+
version_path = cama_resize_upload(settings[:uploaded_io].path, v, {replace: false})
|
68
69
|
cama_uploader.add_file(version_path, cama_uploader.version_path(res['key'], v), is_thumb: true, same_name: true)
|
69
70
|
FileUtils.rm_f(version_path)
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
73
74
|
# generate thumb
|
74
|
-
cama_uploader_generate_thumbnail(uploaded_io.path, res['key'], settings[:thumb_size]) if settings[:generate_thumb] && res['thumb'].present?
|
75
|
-
|
76
|
-
FileUtils.rm_f(uploaded_io.path) if settings[:remove_source]
|
75
|
+
cama_uploader_generate_thumbnail(uploaded_io.path, res['key'], settings[:thumb_size], settings[:remove_source]) if settings[:generate_thumb] && res['thumb'].present?
|
76
|
+
FileUtils.rm_f(uploaded_io.path) if File.exist?(uploaded_io.path) if settings[:remove_source]
|
77
77
|
|
78
78
|
hooks_run('after_upload', settings)
|
79
79
|
res
|
@@ -82,13 +82,13 @@ module CamaleonCms::UploaderHelper
|
|
82
82
|
# generate thumbnail of a existent image
|
83
83
|
# key: key of the current file
|
84
84
|
# the thumbnail will be saved in my_images/my_img.png => my_images/thumb/my_img.png
|
85
|
-
def cama_uploader_generate_thumbnail(uploaded_io, key, thumb_size = nil)
|
85
|
+
def cama_uploader_generate_thumbnail(uploaded_io, key, thumb_size = nil, remove_source = false)
|
86
86
|
w, h = cama_uploader.thumb[:w], cama_uploader.thumb[:h]
|
87
87
|
w, h = thumb_size.split('x') if thumb_size.present?
|
88
88
|
uploaded_io = File.open(uploaded_io) if uploaded_io.is_a?(String)
|
89
89
|
path_thumb = cama_resize_and_crop(uploaded_io.path, w, h)
|
90
|
-
thumb = cama_uploader.add_file(path_thumb, cama_uploader.version_path(key), is_thumb: true, same_name: true)
|
91
|
-
FileUtils.rm_f(path_thumb)
|
90
|
+
thumb = cama_uploader.add_file(path_thumb, cama_uploader.version_path(key).sub('.svg', '.jpg'), is_thumb: true, same_name: true)
|
91
|
+
FileUtils.rm_f(path_thumb) if remove_source
|
92
92
|
thumb
|
93
93
|
end
|
94
94
|
|
@@ -133,24 +133,26 @@ module CamaleonCms::UploaderHelper
|
|
133
133
|
def cama_crop_image(file_path, w=nil, h=nil, w_offset = 0, h_offset = 0, resize = false , replace = true)
|
134
134
|
force = ""
|
135
135
|
force = "!" if w.present? && h.present? && !w.include?("?") && !h.include?("?")
|
136
|
-
|
137
|
-
w =
|
138
|
-
h =
|
139
|
-
|
140
|
-
|
141
|
-
i.
|
136
|
+
img = MiniMagick::Image.open(file_path)
|
137
|
+
w = img[:width].to_f > w.sub('?', '').to_i ? w.sub('?', "") : img[:width] if w.present? && w.to_s.include?('?')
|
138
|
+
h = img[:height].to_f > h.sub('?', '').to_i ? h.sub('?', "") : img[:height] if h.present? && h.to_s.include?('?')
|
139
|
+
data = {img: img, w: w, h: h, w_offset: w_offset, h_offset: h_offset, resize: resize, replace: replace}; hooks_run("before_crop_image", data)
|
140
|
+
data[:img].combine_options do |i|
|
141
|
+
i.resize("#{w if w.present?}x#{h if h.present?}#{force}") if data[:resize]
|
142
|
+
i.crop "#{w if w.present?}x#{h if h.present?}+#{w_offset}+#{h_offset}#{force}" unless data[:resize]
|
142
143
|
end
|
143
144
|
|
144
145
|
res = file_path
|
145
|
-
unless replace
|
146
|
+
unless data[:replace]
|
146
147
|
ext = File.extname(file_path)
|
147
148
|
res = file_path.gsub(ext, "_crop#{ext}")
|
148
149
|
end
|
149
|
-
|
150
|
+
data[:img].write res
|
150
151
|
res
|
151
152
|
end
|
152
153
|
|
153
154
|
# resize and crop a file
|
155
|
+
# SVGs are converted to JPEGs for editing
|
154
156
|
# Params:
|
155
157
|
# file: (String) File path
|
156
158
|
# w: (Integer) width
|
@@ -164,6 +166,11 @@ module CamaleonCms::UploaderHelper
|
|
164
166
|
def cama_resize_and_crop(file, w, h, settings = {})
|
165
167
|
settings = {gravity: :north_east, overwrite: true, output_name: ""}.merge(settings)
|
166
168
|
img = MiniMagick::Image.open(file)
|
169
|
+
if file.end_with? '.svg'
|
170
|
+
img.format 'jpg'
|
171
|
+
file.sub! '.svg', '.jpg'
|
172
|
+
settings[:output_name].sub!('.svg', '.jpg') if settings[:output_name]
|
173
|
+
end
|
167
174
|
w = img[:width].to_f > w.sub('?', '').to_i ? w.sub('?', "") : img[:width] if w.present? && w.to_s.include?('?')
|
168
175
|
h = img[:height].to_f > h.sub('?', '').to_i ? h.sub('?', "") : img[:height] if h.present? && h.to_s.include?('?')
|
169
176
|
w_original, h_original = [img[:width].to_f, img[:height].to_f]
|
@@ -181,19 +188,21 @@ module CamaleonCms::UploaderHelper
|
|
181
188
|
h_result = h
|
182
189
|
end
|
183
190
|
|
184
|
-
w_offset, h_offset = cama_crop_offsets_by_gravity(settings[:gravity], [w_result, h_result], [
|
185
|
-
img
|
186
|
-
|
191
|
+
w_offset, h_offset = cama_crop_offsets_by_gravity(settings[:gravity], [w_result, h_result], [w, h])
|
192
|
+
data = {img: img, w: w, h: h, w_offset: w_offset, h_offset: h_offset, op_resize: op_resize, settings: settings}; hooks_run("before_resize_crop", data)
|
193
|
+
data[:img].combine_options do |i|
|
194
|
+
i.resize(data[:op_resize])
|
187
195
|
i.gravity(settings[:gravity])
|
188
|
-
i.crop "#{w.to_i}x#{h.to_i}+#{w_offset}+#{h_offset}!"
|
196
|
+
i.crop "#{data[:w].to_i}x#{data[:h].to_i}+#{data[:w_offset]}+#{data[:h_offset]}!"
|
189
197
|
end
|
190
198
|
|
191
|
-
|
192
|
-
|
199
|
+
if settings[:overwrite]
|
200
|
+
data[:img].write(file.sub '.svg', '.jpg')
|
201
|
+
else
|
193
202
|
if settings[:output_name].present?
|
194
|
-
img.write(file = File.join(File.dirname(file), settings[:output_name]).to_s)
|
203
|
+
data[:img].write(file = File.join(File.dirname(file), settings[:output_name]).to_s)
|
195
204
|
else
|
196
|
-
img.write(file = uploader_verify_name(File.join(File.dirname(file), "crop_#{File.basename(file)}")))
|
205
|
+
data[:img].write(file = uploader_verify_name(File.join(File.dirname(file), "crop_#{File.basename(file.sub '.svg', '.jpg')}")))
|
197
206
|
end
|
198
207
|
end
|
199
208
|
file
|
@@ -271,7 +280,7 @@ module CamaleonCms::UploaderHelper
|
|
271
280
|
}
|
272
281
|
hooks_run("on_uploader", args)
|
273
282
|
return args[:custom_uploader] if args[:custom_uploader].present?
|
274
|
-
|
283
|
+
|
275
284
|
case args[:server]
|
276
285
|
when 's3', 'aws'
|
277
286
|
CamaleonCmsAwsUploader.new({current_site: current_site, thumb: args[:thumb], aws_settings: args[:aws_settings]}, self)
|