alchemy-dragonfly-s3 5.0.6 → 5.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +14 -8
- data/lib/alchemy-dragonfly-s3.rb +1 -0
- data/lib/alchemy/dragonfly/s3/create_picture_thumb.rb +19 -0
- data/lib/alchemy/dragonfly/s3/engine.rb +4 -13
- data/lib/alchemy/dragonfly/s3/version.rb +1 -1
- metadata +9 -55
- data/app/assets/config/alchemy_dragonfly_s3_manifest.js +0 -1
- data/app/assets/images/alchemy/missing-image.svg +0 -1
- data/app/models/alchemy/attachment/s3_url.rb +0 -11
- data/app/models/alchemy/picture/s3_url.rb +0 -41
- data/app/models/alchemy/picture_thumb.rb +0 -38
- data/app/models/alchemy/picture_thumb/create.rb +0 -28
- data/app/models/alchemy/picture_thumb/signature.rb +0 -23
- data/app/models/alchemy/picture_thumb/uid.rb +0 -22
- data/app/models/alchemy/picture_variant.rb +0 -114
- data/app/views/alchemy/admin/attachments/show.html.erb +0 -54
- data/app/views/alchemy/admin/pictures/_picture.html.erb +0 -53
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +0 -20
- data/app/views/alchemy/admin/pictures/show.html.erb +0 -43
- data/app/views/alchemy/essences/_essence_file_view.html.erb +0 -14
- data/db/migrate/1_create_alchemy_picture_thumbs.rb +0 -12
- data/lib/alchemy/attachment_monkey_patch.rb +0 -13
- data/lib/alchemy/essence_picture_monkey_patch.rb +0 -19
- data/lib/alchemy/picture_monkey_patch.rb +0 -43
- data/lib/tasks/alchemy_dragonfly_s3/generate.rake +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67600fb3185cda4968bc3afc93e00209d196f92be2183499cebaffc2b9f70e6b
|
4
|
+
data.tar.gz: 6b7b797cbb3f0f0671dbac17670aad87abba125864da0fe72d86c29fc5bfd84c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8350ee48b41e406e1abf57b3bc99daeaae738c560a8ed3b5e952fb624768ad4ee0c8de5047a064a39af81f6817fab9cf3db4a6cd3c69c0bbf3c1e7814ec6fa49
|
7
|
+
data.tar.gz: 38462e8f9b701908f4afe7c66bf40a2d547441a8885bdd2e1c1541d7126157c19dfabb293205dc1ab37396997664b1af29f56100b367e47dd6aa013fd1b73764
|
data/README.md
CHANGED
@@ -1,23 +1,29 @@
|
|
1
|
-
[](https://travis-ci.com/AlchemyCMS/alchemy-dragonfly-s3)
|
2
2
|
|
3
3
|
# AlchemyCMS AWS S3
|
4
4
|
|
5
|
-
|
5
|
+
Provides classes for storing Alchemy pictures and file attachments on Amazon AWS S3.
|
6
6
|
|
7
7
|
## Alchemy Version
|
8
8
|
|
9
|
-
This branch works with Alchemy 5.
|
9
|
+
This branch works with Alchemy 5.1 only.
|
10
10
|
|
11
|
-
- For a Alchemy 5.
|
11
|
+
- For a Alchemy 5.0 compatible version use the `alchemy-5` branch.
|
12
12
|
- For a Alchemy 4 compatible version use the `alchemy-4` branch.
|
13
|
-
- For a Alchemy 3
|
13
|
+
- For a Alchemy 3 compatible version use the `alchemy-3` branch.
|
14
14
|
|
15
15
|
## Installation
|
16
16
|
|
17
17
|
Add this line to your application's Gemfile:
|
18
18
|
|
19
19
|
```ruby
|
20
|
-
gem 'alchemy-dragonfly-s3', github: 'AlchemyCMS/alchemy-dragonfly-s3'
|
20
|
+
gem 'alchemy-dragonfly-s3', github: 'AlchemyCMS/alchemy-dragonfly-s3'
|
21
|
+
```
|
22
|
+
|
23
|
+
For now you also need a special AlchemyCMS branch
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
gem 'alchemy_cms', github: 'tvdeyen/alchemy_cms', branch: 'remote-images'
|
21
27
|
```
|
22
28
|
|
23
29
|
And then execute:
|
@@ -26,10 +32,10 @@ And then execute:
|
|
26
32
|
$ bundle install
|
27
33
|
```
|
28
34
|
|
29
|
-
Install the picture thumbs migration
|
35
|
+
Install the picture thumbs migration from Alchemy 5.1
|
30
36
|
|
31
37
|
```
|
32
|
-
$ bin/rake
|
38
|
+
$ bin/rake alchemy:install:migrations
|
33
39
|
$ bin/rake db:migrate
|
34
40
|
```
|
35
41
|
|
data/lib/alchemy-dragonfly-s3.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Alchemy
|
4
|
+
module Dragonfly
|
5
|
+
module S3
|
6
|
+
class CreatePictureThumb
|
7
|
+
def self.call(variant, signature, uid)
|
8
|
+
image = variant.image
|
9
|
+
image.store(path: uid)
|
10
|
+
variant.picture.thumbs.create!(
|
11
|
+
picture: variant.picture,
|
12
|
+
signature: signature,
|
13
|
+
uid: uid,
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -6,19 +6,10 @@ module Alchemy
|
|
6
6
|
class Engine < ::Rails::Engine
|
7
7
|
engine_name "alchemy_dragonfly_s3"
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
config.to_prepare do
|
14
|
-
files = [
|
15
|
-
"attachment_monkey_patch.rb",
|
16
|
-
"picture_monkey_patch.rb",
|
17
|
-
"essence_picture_monkey_patch.rb",
|
18
|
-
].each do |filename|
|
19
|
-
file = Alchemy::Dragonfly::S3::Engine.root.join("lib", "alchemy", filename)
|
20
|
-
Rails.application.config.cache_classes ? require(file) : load(file)
|
21
|
-
end
|
9
|
+
config.after_initialize do
|
10
|
+
Alchemy::Attachment.url_class = Alchemy::Attachment::S3Url
|
11
|
+
Alchemy::Picture.url_class = Alchemy::Picture::S3Url
|
12
|
+
Alchemy::PictureThumb.generator_class = Alchemy::Dragonfly::S3::CreatePictureThumb
|
22
13
|
end
|
23
14
|
end
|
24
15
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy-dragonfly-s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas von Deyen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: alchemy_cms
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 5.
|
19
|
+
version: 5.1.0.alpha
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '6'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 5.
|
29
|
+
version: 5.1.0.alpha
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '6'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: dragonfly-s3_data_store
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,20 +44,6 @@ dependencies:
|
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '1.3'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: capybara
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - "~>"
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '3.0'
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '3.0'
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: rspec-rails
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,14 +64,14 @@ dependencies:
|
|
78
64
|
requirements:
|
79
65
|
- - "~>"
|
80
66
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
67
|
+
version: '6.0'
|
82
68
|
type: :development
|
83
69
|
prerelease: false
|
84
70
|
version_requirements: !ruby/object:Gem::Requirement
|
85
71
|
requirements:
|
86
72
|
- - "~>"
|
87
73
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
74
|
+
version: '6.0'
|
89
75
|
- !ruby/object:Gem::Dependency
|
90
76
|
name: simplecov
|
91
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,20 +86,6 @@ dependencies:
|
|
100
86
|
- - "~>"
|
101
87
|
- !ruby/object:Gem::Version
|
102
88
|
version: '0.17'
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: shoulda-matchers
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '4.0'
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - "~>"
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '4.0'
|
117
89
|
description: AlchemyCMS Integration for the Dragonfly S3 datastore.
|
118
90
|
email:
|
119
91
|
- thomas@vondeyen.com
|
@@ -123,28 +95,10 @@ extra_rdoc_files: []
|
|
123
95
|
files:
|
124
96
|
- MIT-LICENSE
|
125
97
|
- README.md
|
126
|
-
- app/assets/config/alchemy_dragonfly_s3_manifest.js
|
127
|
-
- app/assets/images/alchemy/missing-image.svg
|
128
|
-
- app/models/alchemy/attachment/s3_url.rb
|
129
|
-
- app/models/alchemy/picture/s3_url.rb
|
130
|
-
- app/models/alchemy/picture_thumb.rb
|
131
|
-
- app/models/alchemy/picture_thumb/create.rb
|
132
|
-
- app/models/alchemy/picture_thumb/signature.rb
|
133
|
-
- app/models/alchemy/picture_thumb/uid.rb
|
134
|
-
- app/models/alchemy/picture_variant.rb
|
135
|
-
- app/views/alchemy/admin/attachments/show.html.erb
|
136
|
-
- app/views/alchemy/admin/pictures/_picture.html.erb
|
137
|
-
- app/views/alchemy/admin/pictures/_picture_to_assign.html.erb
|
138
|
-
- app/views/alchemy/admin/pictures/show.html.erb
|
139
|
-
- app/views/alchemy/essences/_essence_file_view.html.erb
|
140
|
-
- db/migrate/1_create_alchemy_picture_thumbs.rb
|
141
98
|
- lib/alchemy-dragonfly-s3.rb
|
142
|
-
- lib/alchemy/
|
99
|
+
- lib/alchemy/dragonfly/s3/create_picture_thumb.rb
|
143
100
|
- lib/alchemy/dragonfly/s3/engine.rb
|
144
101
|
- lib/alchemy/dragonfly/s3/version.rb
|
145
|
-
- lib/alchemy/essence_picture_monkey_patch.rb
|
146
|
-
- lib/alchemy/picture_monkey_patch.rb
|
147
|
-
- lib/tasks/alchemy_dragonfly_s3/generate.rake
|
148
102
|
homepage: https://alchemy-cms.com
|
149
103
|
licenses:
|
150
104
|
- MIT
|
@@ -1 +0,0 @@
|
|
1
|
-
//= link alchemy/missing-image.svg
|
@@ -1 +0,0 @@
|
|
1
|
-
<svg aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" width="16" height="16"><path fill="#f7f7f7" d="M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z" class=""></path></svg>
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Alchemy
|
4
|
-
class Picture < BaseRecord
|
5
|
-
class S3Url
|
6
|
-
attr_reader :variant
|
7
|
-
|
8
|
-
# @param [Alchemy::PictureVariant]
|
9
|
-
#
|
10
|
-
def initialize(variant)
|
11
|
-
raise ArgumentError, "Variant missing!" if variant.nil?
|
12
|
-
|
13
|
-
@variant = variant
|
14
|
-
end
|
15
|
-
|
16
|
-
def call(*)
|
17
|
-
return variant.image.remote_url unless processible_image?
|
18
|
-
|
19
|
-
::Dragonfly.app(:alchemy_pictures).remote_url_for(uid)
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def processible_image?
|
25
|
-
variant.image.is_a?(::Dragonfly::Job)
|
26
|
-
end
|
27
|
-
|
28
|
-
def uid
|
29
|
-
signature = PictureThumb::Signature.call(variant)
|
30
|
-
thumb = variant.picture.thumbs.detect { |t| t.signature == signature }
|
31
|
-
if thumb
|
32
|
-
uid = thumb.uid
|
33
|
-
else
|
34
|
-
uid = PictureThumb::Uid.call(signature, variant)
|
35
|
-
PictureThumb::Create.call(variant, signature, uid)
|
36
|
-
end
|
37
|
-
uid
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Alchemy
|
4
|
-
# The persisted version of a rendered picture variant
|
5
|
-
#
|
6
|
-
class PictureThumb < BaseRecord
|
7
|
-
belongs_to :picture, class_name: "Alchemy::Picture"
|
8
|
-
|
9
|
-
validates :signature, presence: true
|
10
|
-
validates :uid, presence: true
|
11
|
-
|
12
|
-
class << self
|
13
|
-
# Upfront generation of picture thumbnails
|
14
|
-
#
|
15
|
-
# Called after a Alchemy::Picture has been created (after an image has been uploaded)
|
16
|
-
#
|
17
|
-
# Generates three types of thumbnails that are used by Alchemys picture archive and
|
18
|
-
# persists them in the configures file store (Default Dragonfly::FileDataStore).
|
19
|
-
#
|
20
|
-
# @see Picture::THUMBNAIL_SIZES
|
21
|
-
def generate_thumbs!(picture)
|
22
|
-
Alchemy::Picture::THUMBNAIL_SIZES.values.map do |size|
|
23
|
-
variant = Alchemy::PictureVariant.new(picture, {
|
24
|
-
size: size,
|
25
|
-
flatten: true,
|
26
|
-
})
|
27
|
-
signature = Alchemy::PictureThumb::Signature.call(variant)
|
28
|
-
thumb = find_by(signature: signature)
|
29
|
-
next if thumb
|
30
|
-
|
31
|
-
uid = Alchemy::PictureThumb::Uid.call(signature, variant)
|
32
|
-
Alchemy::PictureThumb::Create.call(variant, signature, uid)
|
33
|
-
uid
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Alchemy
|
2
|
-
class PictureThumb < BaseRecord
|
3
|
-
# Stores the render result of a Alchemy::PictureVariant
|
4
|
-
# in the Dragonfly S3 datastore
|
5
|
-
#
|
6
|
-
class Create
|
7
|
-
def self.call(variant, signature, uid)
|
8
|
-
# create the thumb before uploading
|
9
|
-
# to prevent db race conditions
|
10
|
-
thumb = variant.picture.thumbs.create!(
|
11
|
-
picture: variant.picture,
|
12
|
-
signature: signature,
|
13
|
-
uid: uid,
|
14
|
-
)
|
15
|
-
begin
|
16
|
-
# fetch and process the image
|
17
|
-
image = variant.image
|
18
|
-
# upload the processed image
|
19
|
-
image.store(path: uid)
|
20
|
-
rescue RuntimeError, Excon::Error => e
|
21
|
-
Rails.logger.warn(e)
|
22
|
-
# destroy the thumb if processing or upload fails
|
23
|
-
thumb.destroy
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Alchemy
|
4
|
-
class PictureThumb < BaseRecord
|
5
|
-
class Signature
|
6
|
-
# Returns a unique image process signature
|
7
|
-
#
|
8
|
-
# @param [Alchemy::PictureVariant]
|
9
|
-
#
|
10
|
-
# @return [String]
|
11
|
-
def self.call(variant)
|
12
|
-
steps_without_fetch = variant.image.steps.reject do |step|
|
13
|
-
step.is_a?(::Dragonfly::Job::Fetch)
|
14
|
-
end
|
15
|
-
|
16
|
-
steps_with_id = [[variant.picture.id]] + steps_without_fetch
|
17
|
-
job_string = steps_with_id.map(&:to_a).to_dragonfly_unique_s
|
18
|
-
|
19
|
-
Digest::SHA1.hexdigest(job_string)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Alchemy
|
4
|
-
class PictureThumb < BaseRecord
|
5
|
-
class Uid
|
6
|
-
# Returns a image variant uid for storage
|
7
|
-
#
|
8
|
-
# @param [String]
|
9
|
-
# @param [Alchemy::PictureVariant]
|
10
|
-
#
|
11
|
-
# @return [String]
|
12
|
-
def self.call(signature, variant)
|
13
|
-
picture = variant.picture
|
14
|
-
filename = variant.image_file_name || "image"
|
15
|
-
name = File.basename(filename, ".*").gsub(/[^\w.]+/, "_")
|
16
|
-
ext = variant.render_format
|
17
|
-
|
18
|
-
"pictures/#{picture.id}/#{signature}/#{name}.#{ext}"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,114 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "forwardable"
|
4
|
-
|
5
|
-
module Alchemy
|
6
|
-
# Represents a rendered picture
|
7
|
-
#
|
8
|
-
# Resizes, crops and encodes the image with imagemagick
|
9
|
-
#
|
10
|
-
class PictureVariant
|
11
|
-
extend Forwardable
|
12
|
-
|
13
|
-
include Alchemy::Logger
|
14
|
-
include Alchemy::Picture::Transformations
|
15
|
-
|
16
|
-
attr_reader :picture, :render_format
|
17
|
-
|
18
|
-
def_delegators :@picture,
|
19
|
-
:image_file,
|
20
|
-
:image_file_width,
|
21
|
-
:image_file_height,
|
22
|
-
:image_file_name,
|
23
|
-
:image_file_size
|
24
|
-
|
25
|
-
# @param [Alchemy::Picture]
|
26
|
-
#
|
27
|
-
# @param [Hash] options passed to the image processor
|
28
|
-
# @option options [Boolean] :crop Pass true to enable cropping
|
29
|
-
# @option options [String] :crop_from Coordinates to start cropping from
|
30
|
-
# @option options [String] :crop_size Size of the cropping area
|
31
|
-
# @option options [Boolean] :flatten Pass true to flatten GIFs
|
32
|
-
# @option options [String|Symbol] :format Image format to encode the image in
|
33
|
-
# @option options [Integer] :quality JPEG compress quality
|
34
|
-
# @option options [String] :size Size of resulting image in WxH
|
35
|
-
# @option options [Boolean] :upsample Pass true to upsample (grow) an image if the original size is lower than the resulting size
|
36
|
-
#
|
37
|
-
def initialize(picture, options = {})
|
38
|
-
raise ArgumentError, "Picture missing!" if picture.nil?
|
39
|
-
|
40
|
-
@picture = picture
|
41
|
-
@options = options
|
42
|
-
@render_format = options[:format] || picture.default_render_format
|
43
|
-
end
|
44
|
-
|
45
|
-
# Process a variant of picture
|
46
|
-
#
|
47
|
-
# @return [Dragonfly::Attachment|Dragonfly::Job] The processed image variant
|
48
|
-
#
|
49
|
-
def image
|
50
|
-
image = image_file
|
51
|
-
|
52
|
-
raise MissingImageFileError, "Missing image file for #{picture.inspect}" if image.nil?
|
53
|
-
|
54
|
-
image = processed_image(image, @options)
|
55
|
-
image = encoded_image(image, @options)
|
56
|
-
image
|
57
|
-
rescue MissingImageFileError, WrongImageFormatError => e
|
58
|
-
log_warning(e.message)
|
59
|
-
nil
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
|
-
# Returns the processed image dependent of size and cropping parameters
|
65
|
-
def processed_image(image, options = {})
|
66
|
-
size = options[:size]
|
67
|
-
upsample = !!options[:upsample]
|
68
|
-
|
69
|
-
return image unless size.present? && picture.has_convertible_format?
|
70
|
-
|
71
|
-
if options[:crop]
|
72
|
-
crop(size, options[:crop_from], options[:crop_size], upsample)
|
73
|
-
else
|
74
|
-
resize(size, upsample)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Returns the encoded image
|
79
|
-
#
|
80
|
-
# Flatten animated gifs, only if converting to a different format.
|
81
|
-
# Can be overwritten via +options[:flatten]+.
|
82
|
-
#
|
83
|
-
def encoded_image(image, options = {})
|
84
|
-
unless render_format.in?(Alchemy::Picture.allowed_filetypes)
|
85
|
-
raise WrongImageFormatError.new(picture, @render_format)
|
86
|
-
end
|
87
|
-
|
88
|
-
options = {
|
89
|
-
flatten: render_format != "gif" && picture.image_file_format == "gif",
|
90
|
-
}.with_indifferent_access.merge(options)
|
91
|
-
|
92
|
-
encoding_options = []
|
93
|
-
|
94
|
-
convert_format = render_format.sub("jpeg", "jpg") != picture.image_file_format.sub("jpeg", "jpg")
|
95
|
-
|
96
|
-
if render_format =~ /jpe?g/ && convert_format
|
97
|
-
quality = options[:quality] || Config.get(:output_image_jpg_quality)
|
98
|
-
encoding_options << "-quality #{quality}"
|
99
|
-
end
|
100
|
-
|
101
|
-
if options[:flatten]
|
102
|
-
encoding_options << "-flatten"
|
103
|
-
end
|
104
|
-
|
105
|
-
convertion_needed = convert_format || encoding_options.present?
|
106
|
-
|
107
|
-
if picture.has_convertible_format? && convertion_needed
|
108
|
-
image = image.encode(render_format, encoding_options.join(" "))
|
109
|
-
end
|
110
|
-
|
111
|
-
image
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
<div class="resource_info">
|
2
|
-
<div class="value">
|
3
|
-
<label>
|
4
|
-
<%= render_icon @attachment.icon_css_class, style: 'regular', size: 'lg' %>
|
5
|
-
</label>
|
6
|
-
<p><%= @attachment.file_name %></p>
|
7
|
-
</div>
|
8
|
-
<div class="value with-icon">
|
9
|
-
<label><%= Alchemy::Attachment.human_attribute_name(:url) %></label>
|
10
|
-
<p><%= @attachment.url %></p>
|
11
|
-
<a data-clipboard-text="<%= @attachment.url %>" class="icon_button--right">
|
12
|
-
<%= render_icon(:clipboard, style: 'regular') %>
|
13
|
-
</a>
|
14
|
-
</div>
|
15
|
-
<div class="value with-icon">
|
16
|
-
<label><%= Alchemy::Attachment.human_attribute_name(:download_url) %></label>
|
17
|
-
<p><%= @attachment.url %></p>
|
18
|
-
<a data-clipboard-text="<%= @attachment.url %>" class="icon_button--right">
|
19
|
-
<%= render_icon(:clipboard, style: 'regular') %>
|
20
|
-
</a>
|
21
|
-
</div>
|
22
|
-
</div>
|
23
|
-
|
24
|
-
<% case @attachment.icon_css_class %>
|
25
|
-
<% when "file-image" %>
|
26
|
-
<div class="attachment_preview_container image-preview">
|
27
|
-
<%= image_tag(@attachment.url, class: "full_width") %>
|
28
|
-
</div>
|
29
|
-
<% when "file-audio" %>
|
30
|
-
<div class="attachment_preview_container player-preview">
|
31
|
-
<%= audio_tag(@attachment.url, preload: "none", controls: true, class: "full_width") %>
|
32
|
-
</div>
|
33
|
-
<% when "file-video" %>
|
34
|
-
<div class="attachment_preview_container player-preview">
|
35
|
-
<%= video_tag(@attachment.url, preload: "metadata", controls: true, class: "full_width") %>
|
36
|
-
</div>
|
37
|
-
<% when "file-pdf" %>
|
38
|
-
<iframe src="<%= @attachment.url %>" frameborder=0 class="full-iframe">
|
39
|
-
Your browser does not support frames.
|
40
|
-
</iframe>
|
41
|
-
<% end %>
|
42
|
-
|
43
|
-
<script type="text/javascript">
|
44
|
-
$(function() {
|
45
|
-
var clipboard = new Clipboard('.icon_button--right');
|
46
|
-
clipboard.on('success', function(e) {
|
47
|
-
Alchemy.growl('<%= Alchemy.t("Copied to clipboard") %>');
|
48
|
-
e.clearSelection();
|
49
|
-
});
|
50
|
-
Alchemy.currentDialog().dialog.on('DialogClose.Alchemy', function() {
|
51
|
-
clipboard.destroy();
|
52
|
-
});
|
53
|
-
});
|
54
|
-
</script>
|
@@ -1,53 +0,0 @@
|
|
1
|
-
<div class="picture_thumbnail <%= @size %>" id="picture_<%= picture.id %>" name="<%= picture.name %>">
|
2
|
-
<span class="picture_tool select">
|
3
|
-
<%= check_box_tag "picture_ids[]", picture.id %>
|
4
|
-
</span>
|
5
|
-
<% if picture.deletable? && can?(:destroy, picture) %>
|
6
|
-
<span class="picture_tool delete">
|
7
|
-
<%= link_to_confirm_dialog(
|
8
|
-
render_icon(:minus),
|
9
|
-
Alchemy.t(:confirm_to_delete_image_from_server),
|
10
|
-
alchemy.admin_picture_path(
|
11
|
-
id: picture,
|
12
|
-
q: search_filter_params[:q],
|
13
|
-
page: params[:page],
|
14
|
-
tagged_with: search_filter_params[:tagged_with],
|
15
|
-
size: params[:size],
|
16
|
-
filter: search_filter_params[:filter]
|
17
|
-
),
|
18
|
-
{
|
19
|
-
title: Alchemy.t('Delete image')
|
20
|
-
}
|
21
|
-
) -%>
|
22
|
-
</span>
|
23
|
-
<% end %>
|
24
|
-
<% image = image_tag(
|
25
|
-
picture.url(size: preview_size(@size), flatten: true) || "alchemy/missing-image.svg",
|
26
|
-
alt: picture.name,
|
27
|
-
title: Alchemy.t(:zoom_image)
|
28
|
-
) %>
|
29
|
-
<% if can?(:edit, picture) %>
|
30
|
-
<%= link_to(
|
31
|
-
image,
|
32
|
-
alchemy.admin_picture_path(
|
33
|
-
id: picture,
|
34
|
-
q: search_filter_params[:q],
|
35
|
-
page: params[:page],
|
36
|
-
tagged_with: search_filter_params[:tagged_with],
|
37
|
-
size: params[:size],
|
38
|
-
filter: search_filter_params[:filter]
|
39
|
-
),
|
40
|
-
class: 'thumbnail_background'
|
41
|
-
) %>
|
42
|
-
<% else %>
|
43
|
-
<%= image %>
|
44
|
-
<% end %>
|
45
|
-
<span class="picture_name" title="<%= picture.name %>">
|
46
|
-
<%= picture.name %>
|
47
|
-
</span>
|
48
|
-
<div class="picture_tags">
|
49
|
-
<% picture.tag_list.each do |tag| %>
|
50
|
-
<span class="tag"><%= tag %></span>
|
51
|
-
<% end %>
|
52
|
-
</div>
|
53
|
-
</div>
|
@@ -1,20 +0,0 @@
|
|
1
|
-
<div class="picture_thumbnail assign_image_list_detail <%= size.blank? ? 'medium' : size %>" name="<%= picture_to_assign.name %>" id="picture_to_assign_<%= picture_to_assign.id %>">
|
2
|
-
<%= link_to(
|
3
|
-
image_tag(
|
4
|
-
picture_to_assign.url(size: preview_size(size), flatten: true) || "alchemy/missing-image.svg",
|
5
|
-
alt: picture_to_assign.name
|
6
|
-
),
|
7
|
-
alchemy.assign_admin_essence_pictures_path(
|
8
|
-
picture_id: picture_to_assign.id,
|
9
|
-
content_id: @content
|
10
|
-
),
|
11
|
-
remote: true,
|
12
|
-
onclick: '$(self).attr("href", "#").off("click"); return false',
|
13
|
-
method: 'put',
|
14
|
-
title: Alchemy.t(:assign_image),
|
15
|
-
class: 'thumbnail_background'
|
16
|
-
) %>
|
17
|
-
<div class="picture_name" title="<%= picture_to_assign.name %>">
|
18
|
-
<%= picture_to_assign.name %>
|
19
|
-
</div>
|
20
|
-
</div>
|
@@ -1,43 +0,0 @@
|
|
1
|
-
<div class="zoomed-picture-background">
|
2
|
-
<%= image_tag @picture.url || "alchemy/missing-image.svg" %>
|
3
|
-
</div>
|
4
|
-
|
5
|
-
<div class="picture-overlay-navigation">
|
6
|
-
<% if @previous %>
|
7
|
-
<%= link_to alchemy.admin_picture_path(
|
8
|
-
id: @previous,
|
9
|
-
q: search_filter_params[:q],
|
10
|
-
page: params[:page],
|
11
|
-
tagged_with: search_filter_params[:tagged_with],
|
12
|
-
size: params[:size],
|
13
|
-
filter: search_filter_params[:filter]
|
14
|
-
),
|
15
|
-
class: "previous-picture",
|
16
|
-
remote: true do %>
|
17
|
-
<i class="icon fas fa-angle-left fa-fw"></i>
|
18
|
-
<% end %>
|
19
|
-
<% end %>
|
20
|
-
<% if @next %>
|
21
|
-
<%= link_to alchemy.admin_picture_path(
|
22
|
-
id: @next,
|
23
|
-
q: search_filter_params[:q],
|
24
|
-
page: params[:page],
|
25
|
-
tagged_with: search_filter_params[:tagged_with],
|
26
|
-
size: params[:size],
|
27
|
-
filter: search_filter_params[:filter]
|
28
|
-
),
|
29
|
-
class: "next-picture",
|
30
|
-
remote: true do %>
|
31
|
-
<i class="icon fas fa-angle-right fa-fw"></i>
|
32
|
-
<% end %>
|
33
|
-
<% end %>
|
34
|
-
</div>
|
35
|
-
|
36
|
-
<div class="picture-details-overlay">
|
37
|
-
<%= render 'form' %>
|
38
|
-
<%= render 'infos' %>
|
39
|
-
</div>
|
40
|
-
|
41
|
-
<div class="picture-overlay-handle">
|
42
|
-
<i class="icon fas fa-angle-double-right fa-fw"></i>
|
43
|
-
</div>
|
@@ -1,14 +0,0 @@
|
|
1
|
-
<% content = local_assigns[:content] || local_assigns[:essence_file_view] %>
|
2
|
-
<%- if attachment = content.ingredient -%>
|
3
|
-
<%- html_options = local_assigns.fetch(:html_options, {}) -%>
|
4
|
-
<%= link_to(
|
5
|
-
content.essence.link_text.presence ||
|
6
|
-
content.settings_value(:link_text, local_assigns.fetch(:options, {})) ||
|
7
|
-
attachment.name,
|
8
|
-
attachment.url,
|
9
|
-
{
|
10
|
-
class: content.essence.css_class.presence,
|
11
|
-
title: content.essence.title.presence
|
12
|
-
}.merge(html_options)
|
13
|
-
) -%>
|
14
|
-
<%- end -%>
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class CreateAlchemyPictureThumbs < ActiveRecord::Migration[5.0]
|
4
|
-
def change
|
5
|
-
create_table :alchemy_picture_thumbs do |t|
|
6
|
-
t.references :picture, null: false, foreign_key: { to_table: :alchemy_pictures }
|
7
|
-
t.string :signature, null: false
|
8
|
-
t.text :uid, null: false
|
9
|
-
end
|
10
|
-
add_index :alchemy_picture_thumbs, :signature, unique: true
|
11
|
-
end
|
12
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Alchemy
|
4
|
-
module EssencePictureMonkeyPatch
|
5
|
-
def picture_url(options = {})
|
6
|
-
super || "missing-image.png"
|
7
|
-
end
|
8
|
-
|
9
|
-
def thumbnail_url
|
10
|
-
super || "alchemy/missing-image.svg"
|
11
|
-
end
|
12
|
-
|
13
|
-
def allow_image_cropping?
|
14
|
-
super && !!picture.image_file
|
15
|
-
end
|
16
|
-
|
17
|
-
EssencePicture.prepend(self)
|
18
|
-
end
|
19
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Alchemy
|
4
|
-
module PictureMonkeyPatch
|
5
|
-
def self.prepended(klass)
|
6
|
-
klass.has_many :thumbs, class_name: "Alchemy::PictureThumb", dependent: :destroy
|
7
|
-
klass.after_create -> { PictureThumb.generate_thumbs!(self) }
|
8
|
-
end
|
9
|
-
|
10
|
-
# Returns an url (or relative path) to a processed image for use inside an image_tag helper.
|
11
|
-
#
|
12
|
-
# Any additional options are passed to the url method, so you can add params to your url.
|
13
|
-
#
|
14
|
-
# Example:
|
15
|
-
#
|
16
|
-
# <%= image_tag picture.url(size: '320x200', format: 'png') %>
|
17
|
-
#
|
18
|
-
# @see Alchemy::PictureVariant#call for transformation options
|
19
|
-
# @see Alchemy::Picture::Url#call for url options
|
20
|
-
# @return [String|Nil]
|
21
|
-
def url(options = {})
|
22
|
-
return unless image_file
|
23
|
-
|
24
|
-
variant = PictureVariant.new(self, options.slice(*Picture::TRANSFORMATION_OPTIONS))
|
25
|
-
Picture::S3Url.new(variant).call(options.except(*Picture::TRANSFORMATION_OPTIONS).merge(
|
26
|
-
basename: name,
|
27
|
-
ext: variant.render_format,
|
28
|
-
name: name,
|
29
|
-
))
|
30
|
-
rescue ::Dragonfly::Job::Fetch::NotFound => e
|
31
|
-
log_warning(e.message)
|
32
|
-
nil
|
33
|
-
end
|
34
|
-
|
35
|
-
Picture::THUMBNAIL_SIZES = {
|
36
|
-
small: "80x60",
|
37
|
-
medium: "160x120",
|
38
|
-
large: "240x180",
|
39
|
-
}.with_indifferent_access.freeze
|
40
|
-
|
41
|
-
Picture.prepend(self)
|
42
|
-
end
|
43
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
namespace :alchemy_dragonfly_s3 do
|
4
|
-
namespace :generate do
|
5
|
-
desc "Generates all thumbnails for Alchemy Pictures and EssencePictures."
|
6
|
-
task thumbnails: [
|
7
|
-
"alchemy_dragonfly_s3:generate:picture_thumbnails",
|
8
|
-
"alchemy_dragonfly_s3:generate:essence_picture_thumbnails"
|
9
|
-
]
|
10
|
-
|
11
|
-
desc "Generates thumbnails for Alchemy Pictures."
|
12
|
-
task picture_thumbnails: :environment do
|
13
|
-
puts "Regenerate #{Alchemy::Picture.count} picture thumbnails."
|
14
|
-
puts "Please wait..."
|
15
|
-
|
16
|
-
Alchemy::Picture.find_each do |picture|
|
17
|
-
puts Alchemy::PictureThumb.generate_thumbs!(picture)
|
18
|
-
end
|
19
|
-
|
20
|
-
puts "Done!"
|
21
|
-
end
|
22
|
-
|
23
|
-
desc "Generates thumbnails for Alchemy EssencePictures."
|
24
|
-
task essence_picture_thumbnails: :environment do
|
25
|
-
essence_pictures = Alchemy::EssencePicture.joins(:content, :ingredient_association)
|
26
|
-
puts "Regenerate #{essence_pictures.count} essence picture thumbnails."
|
27
|
-
puts "Please wait..."
|
28
|
-
|
29
|
-
essence_pictures.find_each do |essence_picture|
|
30
|
-
puts essence_picture.picture_url
|
31
|
-
puts essence_picture.thumbnail_url
|
32
|
-
end
|
33
|
-
|
34
|
-
puts "Done!"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|