Skip to content

Commit 66e76a8

Browse files
author
Alex Tharp
authored
Merge pull request #11 from cortex-cms/asset-field-type-config-and-refactor
AssetFieldType Dynamic Config and Refactor
2 parents b6f31f9 + 521791e commit 66e76a8

File tree

12 files changed

+177
-328
lines changed

12 files changed

+177
-328
lines changed

.editorconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
root = true
2+
3+
[*]
4+
indent_style = space
5+
indent_size = 2
6+
end_of_line = lf
7+
insert_final_newline = true
8+
charset = utf-8
9+
trim_trailing_whitespace = true
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
%strong Allowed extensions:
2+
= render_allowed_asset_extensions
3+
%br
4+
%strong Allowed filesize:
5+
= render_max_asset_size
6+
%br
17
= render_field_id
28
= render_label
39
= render_input

app/cells/plugins/core/asset_cell.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Plugins
22
module Core
33
class AssetCell < Plugins::Core::Cell
4+
include ActionView::Helpers::NumberHelper
45
include UtilityHelper
56

67
def input
@@ -9,6 +10,14 @@ def input
910

1011
private
1112

13+
def render_allowed_asset_extensions
14+
field.validations['allowed_extensions']&.join(', ')
15+
end
16+
17+
def render_max_asset_size
18+
number_to_human_size(field.validations['size']&.[]('less_than'))
19+
end
20+
1221
def input_classes
1322
@options[:input_options]&.[](:display)&.[](:classes)
1423
end

app/models/asset_field_type.rb

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
class AssetFieldType < FieldType
2-
VALIDATION_TYPES = {
3-
presence: :valid_presence_validation?,
4-
size: :valid_size_validation?,
5-
content_type: :valid_content_type_validation?
6-
}.freeze
7-
82
attr_accessor :asset_file_name,
93
:asset_content_type,
104
:asset_file_size,
115
:asset_updated_at,
12-
:field_name
6+
:asset
137

14-
attr_reader :data, :validations, :dimensions
8+
attr_reader :dimensions
159

16-
has_attached_file :asset
17-
do_not_validate_attachment_file_type :asset
1810
before_save :extract_dimensions
1911

12+
do_not_validate_attachment_file_type :asset
2013
validates :asset, attachment_presence: true, if: :validate_presence?
14+
validate :validate_asset_size, if: :validate_size?
15+
validate :validate_asset_content_type, if: :validate_content_type?
2116

22-
def validations=(validations_hash)
23-
@validations = validations_hash.deep_symbolize_keys
17+
def metadata=(metadata_hash)
18+
@metadata = metadata_hash.deep_symbolize_keys
19+
Paperclip::HasAttachedFile.define_on(self.class, :asset, metadata)
2420
end
2521

2622
def data=(data_hash)
@@ -40,10 +36,6 @@ def data
4036
}
4137
end
4238

43-
def acceptable_validations?
44-
valid_types? && valid_options?
45-
end
46-
4739
def field_item_as_indexed_json_for_field_type(field_item, options = {})
4840
json = {}
4941
json[mapping_field_name] = asset_file_name
@@ -72,43 +64,53 @@ def extract_dimensions
7264
end
7365
end
7466

67+
def allowed_content_types
68+
validations[:allowed_extensions].collect do |allowed_content_type|
69+
MimeMagic.by_extension(allowed_content_type).type
70+
end
71+
end
72+
7573
def mapping_field_name
7674
"#{field_name.parameterize('_')}_asset_file_name"
7775
end
7876

79-
def valid_types?
80-
validations.all? do |type, options|
81-
VALIDATION_TYPES.include?(type.to_sym)
82-
end
77+
def validate_presence?
78+
@validations.key? :presence
8379
end
8480

85-
def valid_options?
86-
validations.all? do |type, options|
87-
self.send(VALIDATION_TYPES[type])
88-
end
81+
def attachment_size_validator
82+
AttachmentSizeValidator.new(validations[:size].merge(attributes: :asset))
8983
end
9084

91-
def validate_presence?
92-
@validations.key? :presence
85+
def attachment_content_type_validator
86+
AttachmentContentTypeValidator.new({content_type: allowed_content_types}.merge(attributes: :asset))
9387
end
9488

9589
alias_method :valid_presence_validation?, :validate_presence?
9690

97-
def valid_size_validation?
91+
def validate_size?
9892
begin
99-
AttachmentSizeValidator.new(validations[:size].merge(attributes: :asset))
93+
attachment_size_validator
10094
true
10195
rescue ArgumentError, NoMethodError
10296
false
10397
end
10498
end
10599

106-
def valid_content_type_validation?
100+
def validate_content_type?
107101
begin
108-
AttachmentContentTypeValidator.new(validations[:content_type].merge(attributes: :asset))
102+
attachment_content_type_validator
109103
true
110104
rescue ArgumentError, NoMethodError
111105
false
112106
end
113107
end
108+
109+
def validate_asset_size
110+
attachment_size_validator.validate_each(self, :asset, asset)
111+
end
112+
113+
def validate_asset_content_type
114+
attachment_content_type_validator.validate_each(self, :asset, asset)
115+
end
114116
end

app/models/boolean_field_type.rb

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
11
class BooleanFieldType < FieldType
2-
attr_accessor :data, :value, :field_name
3-
attr_reader :validations, :metadata
4-
5-
def validations=(validations_hash)
6-
@validations = {}
7-
end
2+
attr_accessor :value
83

94
def data=(data_hash)
105
@value = data_hash.deep_symbolize_keys[:value]
116
end
127

13-
def metadata=(metadata_hash)
14-
@metadata = metadata_hash.deep_symbolize_keys
15-
end
16-
178
def field_item_as_indexed_json_for_field_type(field_item, options = {})
189
json = {}
1910
json[mapping_field_name] = field_item.data['boolean']
@@ -24,10 +15,6 @@ def mapping
2415
{ name: mapping_field_name, type: :string, analyzer: :snowball }
2516
end
2617

27-
def acceptable_validations?
28-
true
29-
end
30-
3118
private
3219

3320
def mapping_field_name

app/models/date_time_field_type.rb

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,13 @@
11
class DateTimeFieldType < FieldType
2-
VALIDATION_TYPES = {
3-
presence: :valid_presence_validation?
4-
}.freeze
5-
6-
attr_accessor :data, :timestamp, :field_name
7-
attr_reader :validations, :metadata
2+
attr_accessor :timestamp
83

94
validates :timestamp, presence: true, if: :validate_presence?
10-
validate :timestamp_is_valid?
11-
12-
def validations=(validations_hash)
13-
@validations = validations_hash.deep_symbolize_keys
14-
end
5+
validate :timestamp_is_valid?, if: :validate_presence?
156

167
def data=(data_hash)
178
@timestamp = data_hash.deep_symbolize_keys[:timestamp]
189
end
1910

20-
def metadata=(metadata_hash)
21-
@metadata = metadata_hash.deep_symbolize_keys
22-
end
23-
24-
def acceptable_validations?
25-
valid_types? && valid_options?
26-
end
27-
2811
def field_item_as_indexed_json_for_field_type(field_item, options = {})
2912
json = {}
3013
json[mapping_field_name] = field_item.data['date_time']
@@ -42,35 +25,15 @@ def mapping_field_name
4225
end
4326

4427
def timestamp_is_valid?
45-
if @timestamp.blank?
28+
begin
29+
DateTime.parse(@timestamp)
4630
true
47-
else
48-
begin
49-
DateTime.parse(@timestamp)
50-
true
51-
rescue ArgumentError
52-
errors.add(:timestamp, 'must be a valid date')
53-
false
54-
end
55-
end
56-
end
57-
58-
def valid_types?
59-
validations.all? do |type, options|
60-
VALIDATION_TYPES.include?(type)
61-
end
62-
end
63-
64-
def valid_options?
65-
validations.all? do |type, options|
66-
self.send(VALIDATION_TYPES[type])
31+
rescue ArgumentError
32+
errors.add(:timestamp, 'must be a valid date')
33+
false
6734
end
6835
end
6936

70-
def valid_presence_validation?
71-
@validations.key? :presence
72-
end
73-
7437
def validate_presence?
7538
@validations.key? :presence
7639
end

app/models/tag_field_type.rb

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,13 @@
11
class TagFieldType < FieldType
2-
VALIDATION_TYPES = {
3-
presence: :valid_presence_validation?
4-
}.freeze
5-
6-
attr_accessor :data, :tag_list, :field_name
7-
attr_reader :validations, :metadata
2+
attr_accessor :tag_list
83

94
validates :tag_list, presence: true, if: :validate_presence?
105

11-
def validations=(validations_hash)
12-
@validations = validations_hash.deep_symbolize_keys
13-
end
14-
156
def data=(data_hash)
167
@tag_list = data_hash.deep_symbolize_keys[:tag_list]
178
@tag_list.nil? ? nil : (@tag_list = @tag_list.split(","))
189
end
1910

20-
def metadata=(metadata_hash)
21-
@metadata = metadata_hash.deep_symbolize_keys
22-
end
23-
24-
def acceptable_validations?
25-
valid_types? && valid_options?
26-
end
27-
2811
def field_item_as_indexed_json_for_field_type(field_item, options = {})
2912
json = {}
3013
json[mapping_field_name] = field_item.data['tag']
@@ -41,22 +24,6 @@ def mapping_field_name
4124
"#{field_name.parameterize('_')}_tag"
4225
end
4326

44-
def valid_types?
45-
validations.all? do |type, options|
46-
VALIDATION_TYPES.include?(type)
47-
end
48-
end
49-
50-
def valid_options?
51-
validations.all? do |type, options|
52-
self.send(VALIDATION_TYPES[type])
53-
end
54-
end
55-
56-
def valid_presence_validation?
57-
@validations.key? :presence
58-
end
59-
6027
def validate_presence?
6128
@validations.key? :presence
6229
end

app/models/text_field_type.rb

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,13 @@
11
class TextFieldType < FieldType
2-
VALIDATION_TYPES = {
3-
length: :valid_length_validation?,
4-
presence: :valid_presence_validation?
5-
}.freeze
6-
7-
attr_accessor :data, :text, :field_name
8-
attr_reader :validations, :metadata
2+
attr_accessor :text
93

104
validates :text, presence: true, if: :validate_presence?
115
validate :text_length, if: :validate_length?
126

13-
def validations=(validations_hash)
14-
@validations = validations_hash.deep_symbolize_keys
15-
end
16-
177
def data=(data_hash)
188
@text = data_hash.deep_symbolize_keys[:text]
199
end
2010

21-
def metadata=(metadata_hash)
22-
@metadata = metadata_hash.deep_symbolize_keys
23-
end
24-
25-
def acceptable_validations?
26-
valid_types? && valid_options?
27-
end
28-
2911
def field_item_as_indexed_json_for_field_type(field_item, options = {})
3012
json = {}
3113
json[mapping_field_name] = field_item.data['text']
@@ -42,31 +24,6 @@ def mapping_field_name
4224
"#{field_name.parameterize('_')}_text"
4325
end
4426

45-
def valid_types?
46-
validations.all? do |type, options|
47-
VALIDATION_TYPES.include?(type)
48-
end
49-
end
50-
51-
def valid_options?
52-
validations.all? do |type, options|
53-
self.send(VALIDATION_TYPES[type])
54-
end
55-
end
56-
57-
def valid_length_validation?
58-
begin
59-
LengthValidator.new(validations[:length].merge(attributes: [:text]))
60-
true
61-
rescue ArgumentError, NoMethodError
62-
false
63-
end
64-
end
65-
66-
def valid_presence_validation?
67-
@validations.key? :presence
68-
end
69-
7027
def text_present
7128
errors.add(:text, "must be present") if @text.empty?
7229
end

0 commit comments

Comments
 (0)