drg_cms 0.7.0.2 → 0.7.0.8

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +63 -18
  3. data/app/assets/javascripts/drg_cms/jquery.bpopup.js +372 -0
  4. data/app/assets/javascripts/drg_cms_application.js +1 -1
  5. data/app/assets/javascripts/drg_cms_cms.js +1 -1
  6. data/app/assets/stylesheets/drg_cms/drg_cms.css +37 -5
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +2 -2
  8. data/app/controllers/cmsedit_controller.rb +22 -24
  9. data/app/controllers/dc_application_controller.rb +8 -8
  10. data/app/controllers/dc_common_controller.rb +9 -6
  11. data/app/controllers/dc_main_controller.rb +0 -1
  12. data/app/controls/{dc_category_control.rb → dc_gallery_control.rb} +15 -30
  13. data/app/controls/dc_image_control.rb +180 -0
  14. data/app/controls/dc_page_control.rb +3 -3
  15. data/app/controls/dc_poll_result_control.rb +7 -8
  16. data/app/controls/dc_report.rb +9 -4
  17. data/app/controls/design_element_settings_control.rb +88 -37
  18. data/app/forms/all_options.yml +18 -7
  19. data/app/forms/cms_menu.yml +7 -2
  20. data/app/forms/dc_gallery.yml +1 -1
  21. data/app/forms/dc_image.yml +122 -0
  22. data/app/forms/dc_image_search.yml +72 -0
  23. data/app/forms/dc_page.yml +11 -8
  24. data/app/forms/dc_steps_template.yml +2 -1
  25. data/app/helpers/cms_common_helper.rb +24 -16
  26. data/app/helpers/cms_edit_helper.rb +26 -33
  27. data/app/helpers/cms_helper.rb +21 -5
  28. data/app/helpers/cms_index_helper.rb +53 -38
  29. data/app/helpers/dc_application_helper.rb +64 -72
  30. data/app/helpers/dc_image_helper.rb +127 -0
  31. data/app/models/concerns/dc_policy_rule_concern.rb +1 -1
  32. data/app/models/concerns/dc_user_concern.rb +12 -4
  33. data/app/models/dc_category.rb +12 -0
  34. data/app/models/dc_design.rb +5 -4
  35. data/app/models/dc_filter.rb +19 -18
  36. data/app/models/dc_image.rb +237 -0
  37. data/app/models/dc_internals.rb +5 -9
  38. data/app/models/dc_policy_role.rb +8 -8
  39. data/app/models/drgcms_form_fields/drgcms_field.rb +9 -26
  40. data/app/models/drgcms_form_fields/embedded.rb +11 -8
  41. data/app/models/drgcms_form_fields/journal_diff.rb +2 -2
  42. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +51 -47
  43. data/app/models/drgcms_form_fields/select.rb +20 -14
  44. data/app/models/drgcms_form_fields/text_with_select.rb +5 -9
  45. data/app/renderers/dc_gallery_renderer.rb +10 -4
  46. data/app/renderers/dc_page_renderer.rb +7 -7
  47. data/app/renderers/dc_poll_renderer.rb +13 -12
  48. data/app/views/cmsedit/_edit_stuff.html.erb +1 -1
  49. data/app/views/cmsedit/edit.html.erb +1 -1
  50. data/app/views/cmsedit/index.html.erb +1 -1
  51. data/app/views/cmsedit/new.html.erb +1 -0
  52. data/config/locales/drgcms_en.yml +14 -2
  53. data/config/locales/drgcms_sl.yml +13 -2
  54. data/config/locales/models_en.yml +33 -0
  55. data/config/locales/models_sl.yml +44 -1
  56. data/drg_cms.gemspec +1 -1
  57. data/lib/drg_cms/version.rb +1 -1
  58. data/lib/drg_cms.rb +19 -5
  59. data/lib/generators/convert_to_ar/USAGE +8 -0
  60. data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
  61. metadata +16 -10
  62. data/app/assets/javascripts/drg_cms/jquery.bpopup.min.js +0 -7
  63. data/app/views/layouts/__cmsedit.html.erb +0 -16
@@ -0,0 +1,127 @@
1
+ #--
2
+ # Copyright (c) 2022+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+
25
+ ####################################################################
26
+ # Helpers needed by some form fields
27
+ ####################################################################
28
+ module DcImageHelper
29
+
30
+ ############################################################################
31
+ # Will return code for previewing image on top of dc_image entry form
32
+ ############################################################################
33
+ def dc_image_preview(document, *parms)
34
+ src = "/#{dc_get_site.params.dig('dc_image', 'location')}/#{document.first_available_image}"
35
+ %(<span class="dc-image-preview dc-image-preview-1"><img src="#{src}"></img></span>).html_safe
36
+ end
37
+
38
+ ############################################################################
39
+ # Will return code for previewing resized images on dc_image entry form
40
+ ############################################################################
41
+ def dc_image_preview_resized(document, yaml, ignore)
42
+ size = yaml['name'].last
43
+ return '' if document["size_#{size}"].blank?
44
+
45
+ src = "/#{dc_get_site.params.dig('dc_image', 'location')}/#{document.id}-#{size}.#{document.img_type}?#{Time.now.to_i}"
46
+ %(<span class="dc-image-preview"><img src="#{src}"></img></span><div id="dc-image-preview"></div>).html_safe
47
+ end
48
+
49
+ ############################################################################
50
+ # Will return choices for preset image sizes
51
+ ############################################################################
52
+ def dc_image_choices_for_image_size
53
+ sizes = dc_get_site.params.dig('dc_image', 'sizes')
54
+ return ['300x200'] if sizes.blank?
55
+
56
+ sizes.split(",").map(&:strip)
57
+ end
58
+
59
+ ############################################################################
60
+ # Will return code for invoking dc_image_search form to select image select on a DRG Form.
61
+ #
62
+ # @param [String] field_name : Field name to which selected image value will be saved.
63
+ ###########################################################################
64
+ def dc_image_invoke(field_name)
65
+ return '' unless dc_get_site.params.dig('dc_image', 'location')
66
+
67
+ url = url_for(controller: :cmsedit, form_name: :dc_image_search, table: :dc_image, field_name: field_name)
68
+ %(<span class="dc-window-open" data-url="#{url}" title="#{t('drgcms.dc_image.invoke')}">#{mi_icon('image-o')}</span>).html_safe
69
+ end
70
+
71
+ ############################################################################
72
+ # Will return code for previewing image on top of dc_image entry form
73
+ ############################################################################
74
+ def dc_image_first(document, *parms)
75
+ src = "/#{dc_get_site.params.dig('dc_image', 'location')}/#{document.first_available_image}"
76
+ %(<span class="dc-image-preview"><img src="#{src}"></img></span><span id="dc-image-preview">).html_safe
77
+ end
78
+
79
+ ######################################################################
80
+ # Will format qry result as html code for selecting image
81
+ ######################################################################
82
+ def dc_image_select_links(doc, *parms)
83
+ %w[o s m l].inject('') { | r,size| r << dc_image_link_for_select(doc, size) }.html_safe
84
+ end
85
+
86
+ ######################################################################
87
+ # Will return HTML code for selecting image
88
+ ######################################################################
89
+ def dc_image_link_for_select(doc, what)
90
+ field = "size_#{what}"
91
+ value = doc.send(field)
92
+ return '' if value.blank?
93
+
94
+ value = value.split(/\+/).first
95
+ src = "/#{dc_get_site.params.dig('dc_image', 'location')}/#{doc.id}-#{what}.#{doc.img_type}"
96
+ %(
97
+ <div class="img-link"><div>
98
+ #{value}<br>
99
+ <i class="mi-o mi-preview" onclick="dc_image_preview('#{src}');" title="#{t('drgcms.dc_image.preview')}"></i>
100
+ <i class="mi-o mi-check_circle" onclick="dc_image_select('#{src}');" title="#{t('drgcms.dc_image.select')}"></i>
101
+ </div></div>)
102
+ end
103
+
104
+ ######################################################################
105
+ # Will return image file for requested size.
106
+ #
107
+ # @param [String] file_name : Image file name
108
+ # @param [String] size : Preferred image size
109
+ #
110
+ # @return [String] : Image file name if requested size is found. Otherwise first available image.
111
+ ######################################################################
112
+ def dc_image_get_by_size(file_name, size)
113
+ id = file_name[file_name.rindex('/') + 1, 24]
114
+ return 'error: ID not valid' unless BSON::ObjectId.legal?(id)
115
+
116
+ image = DcImage.find(id)
117
+ return 'error: ID not found' unless image
118
+
119
+ what = %w[o s m l].inject('l') do |r, e|
120
+ field_name = "size_#{e}".to_sym
121
+ break e if doc.send(field_name) == size
122
+ e
123
+ end
124
+ "/#{dc_get_site.params.dig('dc_image', 'location')}/#{doc.id}-#{what}.#{doc.img_type}"
125
+ end
126
+
127
+ end
@@ -52,7 +52,7 @@ after_destroy :cache_clear
52
52
  def self.values_for_permissions
53
53
  key = 'helpers.label.dc_policy_rule.choices4_permission'
54
54
  c = I18n.t(key)
55
- c = I18n.t(key, locale: 'en') if c.class == Hash or c.match( 'translation missing' )
55
+ c = I18n.t(key, locale: 'en') if c.class == Hash || c.match(/translation missing/i)
56
56
  c.split(',').inject([]) { |r,e| r << (ar = e.split(':'); [ar.first, ar.last.to_i]) }
57
57
  end
58
58
 
@@ -80,7 +80,7 @@ index group: 1
80
80
  validates_length_of :username, minimum: 4
81
81
  validates :username, uniqueness: true
82
82
  validates :email, uniqueness: true
83
- validate :do_validate
83
+ validate :additional_validates
84
84
 
85
85
  before_save :do_before_save
86
86
  before_validation :do_before_validation
@@ -97,8 +97,16 @@ def has_role?(role_id)
97
97
  role = DcPolicyRole.get_role(role_id)
98
98
  role_id = role.id if role
99
99
  end
100
- role = self.dc_user_roles.where(dc_policy_role_id: role_id).first
101
- (role && role.active)
100
+ role = dc_user_roles.find_by(dc_policy_role_id: role_id)
101
+
102
+ # user can be member of groups
103
+ if role.nil? && member.present?
104
+ member.each do |group_id|
105
+ role = DrgCms.cached(DcUser, group_id).dc_user_roles.find_by(dc_policy_role_id: role_id)
106
+ break if role
107
+ end
108
+ end
109
+ role&.active?
102
110
  end
103
111
 
104
112
  ##########################################################################
@@ -169,7 +177,7 @@ end
169
177
  ##########################################################################
170
178
  # Perform some additional validations
171
179
  ##########################################################################
172
- def do_validate
180
+ def additional_validates
173
181
  if group && member.present?
174
182
  errors.add('member', I18n.t('errors.messages.present'))
175
183
  end
@@ -63,6 +63,16 @@ validates :name, presence: true
63
63
 
64
64
  before_destroy :can_destroy?
65
65
 
66
+ after_save :cache_clear
67
+ after_destroy :cache_clear
68
+
69
+ ####################################################################
70
+ # Clear cache if cache is configured
71
+ ####################################################################
72
+ def cache_clear
73
+ DrgCms.cache_clear(:dc_category)
74
+ end
75
+
66
76
  private
67
77
 
68
78
  #########################################################################
@@ -88,6 +98,8 @@ def self.values_for_parent(site_id = nil) #:nodoc:
88
98
  parent = v.parent
89
99
  until parent.nil?
90
100
  doc = find(parent)
101
+ break if doc.nil?
102
+
91
103
  name = doc.name + ' / ' + name
92
104
  parent = doc.parent
93
105
  end
@@ -124,10 +124,11 @@ end
124
124
  # have site assigned will be selected. Too much designs to select often confuses
125
125
  # end user.
126
126
  ########################################################################
127
- def self.choices4_design(site=nil)
128
- list = site.nil? ? where(active: true) : where(active: true).in(site_id: [nil,site.id]).to_a
129
- list.sort! { |w1, w2| w1.description.casecmp(w2.description) }
130
- list.inject([]) { |r, design| r << [ design.description, design._id] }
127
+ def self.choices4_design(site)
128
+ (site.blank? ? where(active: true) : where(:site_id.in => [nil, BSON::ObjectId.from_string(site) ], active: true))
129
+ .only(:id, :description)
130
+ .order_by(description: 1)
131
+ .map { |design| [design.description, design.id] }
131
132
  end
132
133
 
133
134
  end
@@ -53,32 +53,33 @@ end
53
53
  ######################################################################
54
54
  def self.get_filter(filter)
55
55
  yaml = YAML.load(filter) rescue nil
56
- return yaml if yaml.nil?
57
- return nil if yaml['table'].nil? # old data
58
- #
56
+ return if yaml.nil? || yaml['table'].nil? # old data
57
+
59
58
  model = yaml['table'].classify.constantize
60
59
  field = yaml['field'] == 'id' ? '_id' : yaml['field'] # must be
61
- # evaluate
62
- if yaml['operation'] == 'eval' and model.respond_to?(yaml['field'])
63
- return model.send( yaml['field'] )
60
+ # evaluate
61
+ if yaml['operation'] == 'eval'
62
+ return eval(yaml['value']) if yaml['value'] && yaml['value'] != '#NIL' # evaluated as string
63
+ return model.send( yaml['field'] ) if model.respond_to?(yaml['field']) # defined as scope or method in the model
64
+ return
64
65
  end
65
- # if empty
66
+ # if empty
66
67
  if yaml['operation'] == 'empty'
67
- return model.in(field => [nil,''])
68
+ return model.in(field => [nil, ''])
68
69
  end
69
- # if value == NIL no filter is necessary
70
- return nil if yaml['value'].class == String and yaml['value'] == '#NIL'
70
+ # if value == NIL no filter is necessary
71
+ return if yaml['value'].class == String && yaml['value'] == '#NIL'
71
72
 
72
- # do regex if operation is like
73
+ # do regex if operation is like
73
74
  value = yaml['operation'] == 'like' ? /#{yaml['value']}/i : yaml['value']
74
- # when field type is ObjectId transform value
75
- if model.fields[field] and model.fields[field].type == BSON::ObjectId
75
+ # when field type is ObjectId transform value
76
+ if model.fields[field] && model.fields[field].type == BSON::ObjectId
76
77
  value = BSON::ObjectId.from_string(value) rescue nil
77
78
  end
78
- #
79
- if ['eq','like'].include?(yaml['operation'])
79
+
80
+ if %w[eq like].include?(yaml['operation'])
80
81
  model.where(field => value)
81
- # TODO in operator
82
+ # TODO in operator
82
83
  else
83
84
  model.where(field.to_sym.send(yaml['operation']) => value)
84
85
  end
@@ -109,7 +110,7 @@ end
109
110
  def self.get_filter_field(parent)
110
111
  return '' if parent.session[ parent.form['table'] ].nil?
111
112
 
112
- filter = parent.session[ parent.form['table'] ][:filter]
113
+ filter = parent.session[parent.form['table']][:filter]
113
114
  return '' if filter.nil?
114
115
 
115
116
  filter = YAML.load(filter) rescue nil
@@ -124,7 +125,7 @@ def self.get_filter_field(parent)
124
125
  # If field has choices available in labels, use them. This is most likely select input field.
125
126
  if field['name']
126
127
  choices = parent.t('helpers.label.' + parent.form['table'] + '.choices4_' + field['name'] )
127
- unless choices.match( 'translation missing' ) or choices.match('helpers.label')
128
+ unless choices.match(/translation missing/i) || choices.match('helpers.label')
128
129
  field['choices'] = choices
129
130
  end
130
131
  end
@@ -0,0 +1,237 @@
1
+ #--
2
+ # Copyright (c) 2022+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ ##########################################################################
25
+ # == Schema information
26
+ #
27
+ # Collection name: dc_images : Images
28
+ #
29
+ # _id BSON::ObjectId _id
30
+ # created_at Time created_at
31
+ # updated_at Time updated_at
32
+ # dc_site_id BSON::ObjectId Site id
33
+ # dc_user_id BSON::ObjectId User's id
34
+ # name String ip
35
+ # short String short name
36
+ # text String text
37
+ # size_l String Large image size
38
+ # size_m String Medium image size
39
+ # size_s String Small image size
40
+ #
41
+ # DRG CMS module for saveing and manipulating images.
42
+ #
43
+ # If you want to use this module you must install image magick tools
44
+ # and mini_magick ruby gem.
45
+ ##########################################################################
46
+ class DcImage
47
+ include Mongoid::Document
48
+ include Mongoid::Timestamps
49
+
50
+ field :name, type: String
51
+ field :img_type, type: String
52
+ field :text, type: String
53
+ field :short, type: String
54
+ field :keep_original, type: Boolean, default: false
55
+ field :size_o, type: String
56
+ field :size_l, type: String
57
+ field :size_m, type: String
58
+ field :size_s, type: String
59
+ field :categories, type: Array, default: []
60
+ field :created_by, type: BSON::ObjectId
61
+
62
+ belongs_to :dc_user
63
+
64
+ index dc_site_id: 1
65
+ index created_by: 1
66
+ index categories: 1
67
+
68
+ before_validation :set_original
69
+
70
+ validate :validate_image_values
71
+
72
+ #########################################################################
73
+ # checks that image size values are in correct format. Must be hsize[x]vsize (ex. 300x200)
74
+ #########################################################################
75
+ def set_original
76
+ if keep_original
77
+ if size_o.blank?
78
+ image = MiniMagick::Image.open(name)
79
+ self.size_o = "#{image.width}x#{image.height}"
80
+ end
81
+ else
82
+ self.size_o = ''
83
+ end
84
+ end
85
+
86
+ #########################################################################
87
+ # checks that image size values are in correct format. Must be hsize[x]vsize (ex. 300x200)
88
+ #########################################################################
89
+ def validate_image_values
90
+ %w[l m s o].each do |size|
91
+ field = "size_#{size}"
92
+ value = send(field)
93
+ next if value.blank?
94
+
95
+ a = value.strip.split(/x|\+/)
96
+ a[0, 2].each { |e| errors.add(field, I18n.t('drgcms.not_valid')) unless e.to_i > 0 }
97
+ end
98
+ end
99
+
100
+ #########################################################################
101
+ # For mapping categories array to input text_area field
102
+ #########################################################################
103
+ def cats_input=(what)
104
+ self.categories = if what.blank?
105
+ []
106
+ else
107
+ what.chomp.split("\n").map(&:downcase).map(&:strip)
108
+ end
109
+ end
110
+
111
+ #########################################################################
112
+ # For mapping categories array to input text_area field
113
+ #########################################################################
114
+ def cats_input
115
+ self.categories.join("\n")
116
+ end
117
+
118
+ #########################################################################
119
+ # For mapping categories array to display field
120
+ #########################################################################
121
+ def categories_line
122
+ categories ? categories.join(", ") : ''
123
+ end
124
+
125
+ #########################################################################
126
+ # Will return first available image starting from small up
127
+ #########################################################################
128
+ def first_available_image
129
+ image = %w[o s m l].each do |size|
130
+ field = "size_#{size}"
131
+ value = send(field)
132
+ return "#{id}-#{size}.#{img_type}" if value.present?
133
+ end
134
+ end
135
+
136
+ #########################################################################
137
+ # Will return size for large image
138
+ #########################################################################
139
+ def size_ls
140
+ size_l.blank? ? '' : size_l.split(/x|\+/)[0, 2].join('x')
141
+ end
142
+
143
+ #########################################################################
144
+ # Will set new size for large image
145
+ #########################################################################
146
+ def size_ls=(value)
147
+ self.size_l = value.blank? ? '' : value
148
+ end
149
+
150
+ #########################################################################
151
+ # Will return x offset for cropping large image
152
+ #########################################################################
153
+ def offset_lx
154
+ size_l.blank? ? '' : size_l.split(/x|\+/)[2].to_i
155
+ end
156
+
157
+ #########################################################################
158
+ # Will set x offset for cropping large image
159
+ #########################################################################
160
+ def offset_lx=(value)
161
+ self.size_l << (size_l.blank? ? '' : "+#{value}")
162
+ end
163
+
164
+ #########################################################################
165
+ # Will return y offset for cropping large image
166
+ #########################################################################
167
+ def offset_ly
168
+ size_l.blank? ? '' : size_l.split(/x|\+/)[3].to_i
169
+ end
170
+
171
+ #########################################################################
172
+ # Will set y offset for cropping large image
173
+ #########################################################################
174
+ def offset_ly=(value)
175
+ self.size_l << (size_l.blank? ? '' : "+#{value}")
176
+ end
177
+
178
+ def size_ms
179
+ size_m.blank? ? '' : size_m.split(/x|\+/)[0, 2].join('x')
180
+ end
181
+
182
+ def size_ms=(value)
183
+ self.size_m = value.blank? ? '' : value
184
+ end
185
+
186
+ def offset_mx
187
+ size_m.blank? ? '' : size_m.split(/x|\+/)[2].to_i
188
+ end
189
+
190
+ def offset_mx=(value)
191
+ self.size_m << (size_m.blank? ? '' : "+#{value}")
192
+ end
193
+
194
+ def offset_my
195
+ size_m.blank? ? '' : size_m.split(/x|\+/)[3].to_i
196
+ end
197
+
198
+ def offset_my=(value)
199
+ self.size_m << (size_m.blank? ? '' : "+#{value}")
200
+ end
201
+
202
+ def size_ss
203
+ size_s.blank? ? '' : size_s.split(/x|\+/)[0, 2].join('x')
204
+ end
205
+
206
+ def size_ss=(value)
207
+ self.size_s = value.blank? ? '' : value
208
+ end
209
+
210
+ def offset_sx
211
+ size_s.blank? ? '' : size_s.split(/x|\+/)[2].to_i
212
+ end
213
+
214
+ def offset_sx=(value)
215
+ self.size_s << (size_s.blank? ? '' : "+#{value}")
216
+ end
217
+
218
+ def offset_sy
219
+ size_s.blank? ? '' : size_s.split(/x|\+/)[3].to_i
220
+ end
221
+
222
+ def offset_sy=(value)
223
+ self.size_s << (size_s.blank? ? '' : "+#{value}")
224
+ end
225
+
226
+ #########################################################################
227
+ # Return all users that have contributed images
228
+ #########################################################################
229
+ def self.all_users
230
+ DcUser.where(:id.in => distinct(:created_by)).order_by(name: 1).map { |doc| [doc.name, doc.id] }
231
+ end
232
+
233
+ def self.html_code
234
+ 'code'
235
+ end
236
+
237
+ end
@@ -28,11 +28,10 @@
28
28
  ##########################################################################
29
29
  module DcInternals
30
30
  INTERNALS = {
31
- 'current_user' => 'session[:user_id]',
31
+ 'current_user' => 'session[:user_id].to_s',
32
32
  'current_user_name' => 'session[:user_name]',
33
- 'current_site' => 'dc_get_site.id'
33
+ 'current_site' => 'dc_get_site.id.to_s'
34
34
  }
35
- #
36
35
  @additions = {}
37
36
 
38
37
  ##########################################################################
@@ -40,7 +39,7 @@ module DcInternals
40
39
  # to be added to structure and be used together with predefined values.
41
40
  ##########################################################################
42
41
  def self.add_internal(hash)
43
- hash.each {|key,value| additions[key] = value}
42
+ hash.each { |key, value| additions[key] = value }
44
43
  end
45
44
 
46
45
  ##########################################################################
@@ -48,11 +47,8 @@ end
48
47
  # to be added to structure and be used together with predefined values.
49
48
  ##########################################################################
50
49
  def self.get(key)
51
- key = key.sub('@','')
52
-
53
- value = INTERNALS[key]
54
- value = @additions[key] if value.nil?
55
- value
50
+ key.sub!('@', '')
51
+ INTERNALS[key] || @additions[key]
56
52
  end
57
53
 
58
54
  end
@@ -55,30 +55,30 @@ after_save :cache_clear
55
55
  after_destroy :cache_clear
56
56
 
57
57
  ####################################################################
58
- # Clear cache if cache is configured
58
+ # Clear cache when cache is configured
59
59
  ####################################################################
60
60
  def cache_clear
61
61
  DrgCms.cache_clear(:dc_permission)
62
62
  DrgCms.cache_clear(:dc_site)
63
+ DrgCms.cache_clear(:dc_policy_role)
63
64
  end
64
65
 
65
66
  ########################################################################
66
67
  # Return all defined roles as choices for use in select field.
67
68
  ########################################################################
68
69
  def self.choices4_roles
69
- where(active: true).order_by(name: 1).inject([]) { |r,role| r << [ role.name, role._id] }
70
+ where(active: true).order_by(name: 1).inject([]) { |r, role| r << [ role.name, role._id] }
70
71
  end
71
72
 
72
73
  ########################################################################
73
74
  # Search for role when role parameter is String.
74
75
  ########################################################################
75
76
  def self.get_role(role)
76
- if role.class == String
77
- rol = role
78
- role = find_by(name: rol) || find_by(system_name: rol)
79
- end
80
- role
81
- end
77
+ doc = DrgCms.cache_read(['dc_policy_role', role])
78
+ return doc if doc
82
79
 
80
+ doc = find_by(name: role) || find_by(system_name: role)
81
+ DrgCms.cache_write(['dc_policy_role', role], doc)
82
+ end
83
83
 
84
84
  end
@@ -114,11 +114,11 @@ end
114
114
  # Returns:
115
115
  # String. Translated text.
116
116
  ####################################################################
117
- def t(key, default='')
117
+ def t(key, default = '')
118
118
  c = I18n.t(key)
119
- if c.match( 'translation missing' )
119
+ if c.match(/translation missing/i)
120
120
  c = I18n.t(key, locale: 'en')
121
- # Still not found. Return default if set
121
+ # Still not found. Return default if set
122
122
  c = default unless default.blank?
123
123
  end
124
124
  c
@@ -127,15 +127,8 @@ end
127
127
  ####################################################################
128
128
  # Standard code for returning readonly field.
129
129
  ####################################################################
130
- def ro_standard(value=nil)
131
- if value.nil?
132
- value = if @yaml['html']['value']
133
- @yaml['html']['value']
134
- else
135
- @record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
136
- end
137
- end
138
- #@html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
130
+ def ro_standard(value = nil)
131
+ value ||= @yaml['html']['value'] || (@record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil)
139
132
  @html << %(<div id="#{@yaml['name']}" class="dc-readonly">#{value}</div>)
140
133
  self
141
134
  end
@@ -157,8 +150,9 @@ def set_initial_value(opt1 = 'html', opt2 = 'value')
157
150
  value_send_as = 'p_' + @yaml['name']
158
151
  if @parent.params[value_send_as]
159
152
  @yaml[opt1][opt2] = @parent.params[value_send_as]
160
- elsif @parent.flash[:record] and @parent.flash[:record][@yaml['name']]
161
- @yaml[opt1][opt2] = @parent.flash[:record][@yaml['name']]
153
+ elsif @parent.flash[:record]
154
+ value = @parent.flash[:record][@yaml['name']] || @parent.flash[:record][@yaml['name'].to_sym]
155
+ @yaml[opt1][opt2] = value if value
162
156
  end
163
157
  set_default_value(opt1, opt2) if @yaml['default']
164
158
  end
@@ -217,24 +211,13 @@ def set_style()
217
211
  end
218
212
  end
219
213
 
220
- ####################################################################
221
- # DEPRECATED!
222
- #
223
- # Returns css code for the field if specified. It replaces all occurences of '# '
224
- # with field name id, as defined on form.
225
- ####################################################################
226
- def __css_code
227
- return '' if @css.blank?
228
- @css.gsub!('# ',"#td_record_#{@yaml['name']} ")
229
- "\n<style type=\"text/css\">#{@css}</style>"
230
- end
231
-
232
214
  ####################################################################
233
215
  # Sets css code for the field if specified. It replaces all occurences of '# '
234
216
  # with field name id, as defined on form.
235
217
  ####################################################################
236
218
  def set_css_code(css)
237
219
  return '' if css.blank?
220
+
238
221
  css.gsub!('# ',"#td_record_#{@yaml['name']} ") if css.match('# ')
239
222
  css
240
223
  end