drg_cms 0.6.0.1 → 0.6.1.1.1

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +454 -145
  3. data/app/assets/javascripts/drg_cms_application.js +1 -1
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +635 -244
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
  6. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  7. data/app/controllers/cmsedit_controller.rb +515 -335
  8. data/app/controllers/dc_application_controller.rb +378 -111
  9. data/app/controllers/dc_common_controller.rb +105 -14
  10. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  11. data/app/controls/dc_help_control.rb +126 -0
  12. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  13. data/app/controls/dc_poll_result_control.rb +88 -0
  14. data/app/controls/dc_report.rb +223 -0
  15. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  16. data/app/forms/all_options.yml +44 -9
  17. data/app/forms/cms_menu.yml +28 -18
  18. data/app/forms/dc_ad.yml +11 -22
  19. data/app/forms/dc_big_table.yml +1 -0
  20. data/app/forms/dc_big_table_value.yml +1 -0
  21. data/app/forms/dc_category.yml +2 -1
  22. data/app/forms/dc_design.yml +20 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_help_1.yml +109 -0
  25. data/app/forms/dc_journal.yml +3 -1
  26. data/app/forms/dc_json_ld.yml +59 -0
  27. data/app/forms/dc_key_value.yml +32 -0
  28. data/app/forms/dc_link.yml +1 -1
  29. data/app/forms/dc_menu.yml +2 -0
  30. data/app/forms/dc_menu_item.yml +2 -0
  31. data/app/forms/dc_page.yml +3 -5
  32. data/app/forms/dc_part.yml +1 -0
  33. data/app/forms/dc_piece.yml +1 -0
  34. data/app/forms/dc_poll.yml +15 -5
  35. data/app/forms/dc_poll_item.yml +2 -1
  36. data/app/forms/dc_poll_result.yml +83 -0
  37. data/app/forms/dc_poll_result_export.yml +35 -0
  38. data/app/forms/dc_seo.yml +33 -0
  39. data/app/forms/dc_simple_menu.yml +2 -0
  40. data/app/forms/dc_site.yml +4 -12
  41. data/app/forms/dc_user.yml +27 -11
  42. data/app/forms/dc_user_role.yml +3 -0
  43. data/app/forms/json_ld_schema.yml +168 -0
  44. data/app/helpers/cms_common_helper.rb +375 -0
  45. data/app/helpers/cms_edit_helper.rb +506 -0
  46. data/app/helpers/cms_helper.rb +268 -0
  47. data/app/helpers/cms_index_helper.rb +580 -0
  48. data/app/helpers/dc_application_helper.rb +218 -306
  49. data/app/models/concerns/dc_page_concern.rb +40 -6
  50. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  51. data/app/models/concerns/dc_seo_concern.rb +66 -0
  52. data/app/models/concerns/dc_site_concern.rb +67 -44
  53. data/app/models/concerns/dc_user_concern.rb +57 -18
  54. data/app/models/dc_design.rb +30 -18
  55. data/app/models/dc_filter.rb +22 -13
  56. data/app/models/dc_json_ld.rb +152 -0
  57. data/app/models/dc_key_value.rb +48 -0
  58. data/app/models/dc_key_value_store.rb +1 -0
  59. data/app/models/dc_memory.rb +8 -1
  60. data/app/models/dc_page.rb +0 -1
  61. data/app/models/dc_permission.rb +49 -9
  62. data/app/models/dc_policy.rb +25 -14
  63. data/app/models/dc_policy_role.rb +22 -11
  64. data/app/models/dc_poll.rb +39 -19
  65. data/app/models/dc_poll_result.rb +46 -0
  66. data/app/models/dc_temp.rb +140 -0
  67. data/app/models/dc_user_role.rb +2 -2
  68. data/app/models/drgcms_form_fields.rb +12 -1
  69. data/app/models/drgcms_form_fields/action.rb +61 -0
  70. data/app/models/drgcms_form_fields/comment.rb +8 -4
  71. data/app/models/drgcms_form_fields/date_picker.rb +11 -9
  72. data/app/models/drgcms_form_fields/date_select.rb +1 -1
  73. data/app/models/drgcms_form_fields/datetime_picker.rb +12 -10
  74. data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
  75. data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
  76. data/app/models/drgcms_form_fields/embedded.rb +26 -16
  77. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  78. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  79. data/app/models/drgcms_form_fields/hash_field.rb +90 -0
  80. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  81. data/app/models/drgcms_form_fields/html_field.rb +1 -1
  82. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  83. data/app/models/drgcms_form_fields/method.rb +66 -0
  84. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
  85. data/app/models/drgcms_form_fields/number_field.rb +15 -6
  86. data/app/models/drgcms_form_fields/radio.rb +96 -0
  87. data/app/models/drgcms_form_fields/readonly.rb +2 -2
  88. data/app/models/drgcms_form_fields/select.rb +92 -29
  89. data/app/models/drgcms_form_fields/text_area.rb +1 -1
  90. data/app/models/drgcms_form_fields/text_autocomplete.rb +31 -17
  91. data/app/models/drgcms_form_fields/text_field.rb +1 -1
  92. data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
  93. data/app/models/drgcms_form_fields/tree_select.rb +15 -4
  94. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  95. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  96. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  97. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  98. data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
  99. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  100. data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
  101. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  102. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  103. data/app/{helpers → renderers}/dc_poll_renderer.rb +91 -64
  104. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  105. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  106. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  107. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  108. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  109. data/app/views/cmsedit/_form.html.erb +4 -3
  110. data/app/views/cmsedit/_result.html.erb +2 -3
  111. data/app/views/cmsedit/edit.html.erb +4 -1
  112. data/app/views/cmsedit/index.html.erb +7 -1
  113. data/app/views/cmsedit/new.html.erb +3 -1
  114. data/app/views/dc_common/_help.html.erb +17 -0
  115. data/app/views/layouts/models.html.erb +2 -1
  116. data/config/locales/drgcms_en.yml +27 -3
  117. data/config/locales/drgcms_sl.yml +32 -5
  118. data/config/locales/models_en.yml +65 -17
  119. data/config/locales/models_sl.yml +69 -18
  120. data/drg_cms.gemspec +1 -1
  121. data/lib/drg_cms.rb +61 -1
  122. data/lib/drg_cms/version.rb +1 -1
  123. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  124. data/lib/tasks/database.rake +6 -56
  125. metadata +73 -54
  126. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  127. data/app/helpers/application_helper.rb +0 -2
  128. data/app/helpers/cmsedit_helper.rb +0 -888
  129. data/app/models/dc_dummy.rb +0 -102
  130. data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -1,4 +1,3 @@
1
- #coding: utf-8
2
1
  #--
3
2
  # Copyright (c) 2012+ Damjan Rems
4
3
  #
@@ -66,8 +65,8 @@ end
66
65
  ####################################################################
67
66
  def dc_user_has_role(role)
68
67
  role = DcPolicyRole.get_role(role)
69
- return false if role.nil? or session[:user_roles].nil?
70
- # role is found in user_roles
68
+ return false if role.nil? || session[:user_roles].nil?
69
+ # role exists in user_roles
71
70
  session[:user_roles].include?(role._id)
72
71
  end
73
72
 
@@ -81,22 +80,28 @@ end
81
80
  # @example Returns Google analytics code from site settings
82
81
  # settings = dc_get_site.params['ga_acc']
83
82
  ####################################################################
84
- def dc_get_site()
85
- return @site if @site
83
+ def dc_get_site
84
+ return @site if @site
85
+
86
86
  uri = URI.parse(request.url)
87
+ cache_key = ['dc_site', uri.host]
88
+
89
+ @site = dc_cache_read(cache_key)
90
+ return @site if @site
91
+
87
92
  @site = DcSite.find_by(name: uri.host)
88
- # Site can be aliased
89
- if @site and !@site.alias_for.blank?
93
+ # Site can be aliased
94
+ if @site && !@site.alias_for.blank?
90
95
  @site = DcSite.find_by(name: @site.alias_for)
91
96
  end
92
- # Development environment. Check if site with name test exists and use
93
- # alias_for as pointer to real site.
94
- if @site.nil? and ENV["RAILS_ENV"] != 'production'
97
+ # Development environment. Check if site with name test exists and use
98
+ # alias_for as pointer to real site.
99
+ if @site.nil? && ENV["RAILS_ENV"] != 'production'
95
100
  @site = DcSite.find_by(name: 'test')
96
101
  @site = DcSite.find_by(name: @site.alias_for) if @site
97
- end
98
- @site = nil if @site and !@site.active # site is disabled
99
- @site
102
+ end
103
+ @site = nil if @site && !@site.active # site is disabled
104
+ dc_cache_write(cache_key, @site)
100
105
  end
101
106
 
102
107
  ##########################################################################
@@ -104,8 +109,9 @@ end
104
109
  #
105
110
  # Sets internal @page_title variable.
106
111
  ##########################################################################
107
- def set_page_title()
108
- @page_title = @page.title.blank? ? "#{@page.subject} - #{@site.page_title}" : @page.title
112
+ def set_page_title
113
+ @page_title = @page.title.blank? ? @page.subject : @page.title
114
+ dc_add_meta_tag(:name, 'description', @page.meta_description)
109
115
  end
110
116
 
111
117
  ########################################################################
@@ -114,21 +120,19 @@ end
114
120
  # @param [String] Form file name. File name can be passed as gem_name.filename. This can
115
121
  # be useful when you are extending form but want to retain same name as original form
116
122
  # For example. You are extending dc_user form from drg_cms gem and want to
117
- # retain same dc_user name. This can be done by setting drg_cms.dc_user to extend option.
123
+ # retain same dc_user name. This can be done by setting drg_cms.dc_user as extend option.
118
124
  #
119
125
  # @return [String] Form file name including path or nil if not found.
120
126
  ########################################################################
121
127
  def dc_find_form_file(form_file)
122
- form_path=nil
123
- if form_file.match(/\.|\//)
124
- form_path,form_file=form_file.split(/\.|\//)
125
- end
128
+ form_path = nil
129
+ form_path, form_file = form_file.split(/\.|\//) if form_file.match(/\.|\//)
130
+
126
131
  DrgCms.paths(:forms).reverse.each do |path|
127
132
  f = "#{path}/#{form_file}.yml"
128
- return f if File.exist?(f) and (form_path.nil? or path.to_s.match(/\/#{form_path}\//i))
133
+ return f if File.exist?(f) && (form_path.nil? || path.to_s.match(/\/#{form_path}(-|\/)/i))
129
134
  end
130
- p "Form file #{form_file} not found!"
131
- nil
135
+ raise "Exception: Form file '#{form_file}' not found!"
132
136
  end
133
137
 
134
138
  #######################################################################
@@ -141,7 +145,7 @@ end
141
145
  # return dc_render_404('Site') unless site
142
146
  ########################################################################
143
147
  def dc_render_404(where_the_error_is=nil)
144
- logger.info("Error 404;#{request.env['REQUEST_URI']};#{request.referer};#{where_the_error_is}")
148
+ logger.info("Error 404;#{request.env['REQUEST_URI'] rescue ''};#{request.referer};#{where_the_error_is}")
145
149
  render(file: Rails.root.join('public/404.html'), status: 404)
146
150
  end
147
151
 
@@ -165,15 +169,7 @@ end
165
169
 
166
170
  protected
167
171
 
168
- #############################################################################
169
- # Add permissions. Subroutine of dc_user_can
170
- ############################################################################
171
- def add_permissions_for(table_name=nil) # :nodoc:
172
- perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
173
- (perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
174
- end
175
-
176
- ############################################################################
172
+ ###########################################################################
177
173
  # Checks if user can perform (read, create, edit, delete) document in specified
178
174
  # table (collection).
179
175
  #
@@ -185,26 +181,75 @@ end
185
181
  # @Example True when user has view permission on the table
186
182
  # if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
187
183
  ############################################################################
188
- def dc_user_can(permission, table=params[:table])
189
- if @permissions.nil?
190
- @permissions = {}
191
- add_permissions_for # default permission
192
- table_name = ''
193
- # permission can be set for table or object embedded in table. Read all possible values
194
- table.strip.downcase.split(';').each do |t|
195
- table_name << (table_name.size > 0 ? ';' : '') + t # table;embedded;another;...
196
- add_permissions_for table_name
197
- end
184
+ def dc_user_can(permission, table = params[:table])
185
+ permissions = DcPermission.permissions_for_table(table)
186
+ session[:user_roles].each {|r| return true if permissions[r] && permissions[r] >= permission }
187
+ false
188
+ end
189
+
190
+ def dc_user_can(permission, table = params[:table])
191
+ cache_key = ['dc_permission', table, session[:user_id], dc_get_site.id]
192
+ permissions = dc_cache_read(cache_key)
193
+ if permissions.nil?
194
+ permissions = DcPermission.permissions_for_table(table)
195
+ dc_cache_write(cache_key, permissions)
198
196
  end
199
- # Return true if any of the permissions user has is higher or equal to requested permission
200
- session[:user_roles].each {|r| return true if @permissions[r] and @permissions[r] >= permission }
197
+ session[:user_roles].each {|r| return true if permissions[r] && permissions[r] >= permission }
201
198
  false
202
- end
199
+ end
200
+
201
+ ####################################################################
202
+ # Read from cache
203
+ #
204
+ # @keys [Array] Array of keys
205
+ #
206
+ # @return [Object] Data returned from cache
207
+ ####################################################################
208
+ def dc_cache_read(keys)
209
+ if redis_cache_store?
210
+ keys = keys.dup
211
+ first = keys.shift
212
+ data = redis.hget(first, keys.join(''))
213
+ data ? Marshal.load(data) : nil
214
+ else
215
+ Rails.cache.read(keys.join(''))
216
+ end
217
+ end
218
+
219
+ def __dc_cache_read(keys)
220
+ p 'read', keys.join(''), Rails.cache.instance_variable_get(:@data).keys
221
+ pp Rails.cache.read(keys.join(''))
222
+ end
223
+
224
+ ####################################################################
225
+ # Write data to cache
226
+ #
227
+ # @param [Array] Array of keys
228
+ # @param [Object] Data written to cache
229
+ #
230
+ # @return [Object] data so dc_cache_write can be used as last statement in method.
231
+ ####################################################################
232
+ def dc_cache_write(keys, data)
233
+ if redis_cache_store?
234
+ keys = keys.dup
235
+ first = keys.shift
236
+ redis.hset(first, keys.join(''), Marshal.dump(data))
237
+ else
238
+ Rails.cache.write(keys.join(''), data)
239
+ end
240
+ data
241
+ end
242
+
243
+ def __dc_cache_write(keys, data)
244
+ p 'write', keys.join('')
245
+ pp Rails.cache.write(keys.join(''), data)
246
+ data
247
+ end
203
248
 
204
249
  ####################################################################
205
- # Detects if called from mobile agent according to http://detectmobilebrowsers.com/
250
+ # Detects if called from mobile agent according to http://detectmobilebrowsers.com/
206
251
  # and set session[:is_mobile]
207
- #
252
+ #
208
253
  # Detect also if caller is a robot and set session[:is_robot]
209
254
  ####################################################################
210
255
  def dc_set_is_mobile
@@ -212,13 +257,12 @@ def dc_set_is_mobile
212
257
  : false
213
258
  session[:is_mobile] = is_mobile ? 1 : 0
214
259
  #
215
- if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
260
+ if request.env["HTTP_USER_AGENT "] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
216
261
  logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
217
262
  session[:is_robot] = true
218
263
  end
219
264
  end
220
265
 
221
-
222
266
  ##########################################################################
223
267
  # Merge values from parameters fields (from site, page ...) into internal @options hash.
224
268
  #
@@ -281,28 +325,32 @@ def get_design_and_render(design_doc)
281
325
  site_top = '<%= dc_page_top %>'
282
326
  site_bottom = '<%= dc_page_bottom %>'
283
327
  # lets try the rails way
284
- if @options[:control] and @options[:action]
328
+ if @options[:control] && @options[:action]
285
329
  controller = "#{@options[:control]}_control".classify.constantize rescue nil
286
330
  extend controller if controller
287
331
  return send @options[:action] if respond_to?(@options[:action])
288
332
  end
289
- #
333
+ # design doc present
290
334
  if design_doc
291
- if !design_doc.rails_view.blank?
292
- if design_doc.rails_view.downcase != 'site'
293
- return render design_doc.rails_view, layout: layout
294
- end
295
- elsif !design_doc.body.blank?
296
- design = site_top + design_doc.body + site_bottom
297
- return render(inline: design, layout: layout)
335
+ # defined as rails view
336
+ design = if design_doc.rails_view.blank? || design_doc.rails_view == 'site'
337
+ @site.rails_view
338
+ else
339
+ design_doc.rails_view
298
340
  end
341
+ return render design, layout: layout unless design.blank?
342
+ # defined as inline code
343
+ design = design_doc.body.blank? ? @site.design : design_doc.body
344
+ design = site_top + design + site_bottom
345
+ return render(inline: design, layout: layout) unless design.blank?
299
346
  end
300
- #
301
- if @site.rails_view.blank?
347
+ # Design doc not defined
348
+ if @site.rails_view.blank?
302
349
  design = site_top + @site.design + site_bottom
303
- return render(inline: design, layout: layout)
304
- end
305
- render @site.rails_view, layout: layout
350
+ render(inline: design, layout: layout)
351
+ else
352
+ render @site.rails_view, layout: layout
353
+ end
306
354
  end
307
355
 
308
356
  ##########################################################################
@@ -319,34 +367,34 @@ end
319
367
  # dc_process_default_request
320
368
  # end
321
369
  ##########################################################################
322
- def dc_process_default_request()
370
+ def dc_process_default_request
323
371
  session[:edit_mode] ||= 0
324
- # Initialize parts
372
+ # Initialize parts
325
373
  @parts = nil
326
374
  @js, @css = '', ''
327
- # find domain name in sites
375
+ # find domain name in sites
328
376
  @site = dc_get_site
329
- # site not defined. render 404 error
377
+ # site not defined. render 404 error
330
378
  return dc_render_404('Site!') if @site.nil?
379
+
331
380
  dc_set_options(@site.settings)
332
- # HOMEPAGE. When no parameters is set
381
+ # HOMEPAGE. When no parameters is set
333
382
  params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
334
- @options[:path] = params[:path].to_s.split('/')
383
+ @options[:path] = params[:path].to_s.downcase.split('/')
335
384
  params[:path] = @options[:path].first if @options[:path].size > 1
336
- # some other process request. It should fail if not defined
385
+ # some other process request. It should fail if not defined
337
386
  return send(@site.request_processor) unless @site.request_processor.blank?
338
-
339
- # Search for page
340
- pageclass = @site.page_table.classify.constantize
387
+ # Search for page
388
+ pageclass = @site.page_klass
341
389
  if params[:id]
342
390
  #Page.where(id: params[:id]).or(subject_link: params[:id]).first
343
391
  @page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
344
392
  @page = pageclass.find(params[:id]) if @page.nil? # I think that there will be more subject_link searchers than id
345
393
  elsif params[:path]
346
- # path may point direct to page's subject_link
394
+ # path may point direct to page's subject_link
347
395
  @page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:path], active: true)
348
396
  if @page.nil?
349
- # no. Find if defined in links
397
+ # no. Find if defined in links
350
398
  link = DcLink.find_by(:dc_site_id.in => [@site._id, nil], name: params[:path])
351
399
  if link
352
400
  #pageclass.find_by(alt_link: params[:path])
@@ -355,29 +403,32 @@ def dc_process_default_request()
355
403
  end
356
404
  end
357
405
  end
358
- # if @page is not found render 404 error
406
+ # if @page is not found render 404 error
359
407
  return dc_render_404('Page!') unless @page
360
- dc_set_options @page.params
361
408
  dc_set_is_mobile unless session[:is_mobile] # do it only once per session
362
- # find design if defined. Otherwise design MUST be declared in site
409
+ # find design if defined. Otherwise design MUST be declared in site
363
410
  if @page.dc_design_id
364
411
  @design = DcDesign.find(@page.dc_design_id)
365
412
  return dc_render_404('Design!') unless @design
366
413
  end
367
- # Add edit menu
414
+ dc_set_options @design.params if @design
415
+ dc_set_options @page.params
416
+ dc_add_json_ld(@page.get_json_ld)
417
+ # Add edit menu
368
418
  if session[:edit_mode] > 0
369
419
  session[:site_id] = @site.id
370
- session[:site_page_table] = @site.page_table
420
+ session[:site_page_class] = @site.page_class
371
421
  session[:page_id] = @page.id
372
- else
373
- # Log only visits from non-editors
422
+ else
423
+ # Log only visits from non-editors
374
424
  dc_log_visit()
375
425
  end
376
426
  set_page_title()
377
427
  get_design_and_render @design
378
428
  end
379
429
 
380
- ##########################################################################
430
+ ######
431
+ # ####################################################################
381
432
  # Single site document kind of request handler.
382
433
  #
383
434
  # This request handler assumes that all data for the site is saved in the site document.
@@ -458,7 +509,7 @@ eot
458
509
  end
459
510
 
460
511
  ####################################################################
461
- # Checks if any errors exist on document and writes debug log. It can also
512
+ # Checks if any errors exist on document and writes error log. It can also
462
513
  # crash if requested. This is mostly usefull in development for debuging
463
514
  # model errors or when saving to multiple collections and where each save must be
464
515
  # checked if succesfull.
@@ -477,14 +528,7 @@ end
477
528
  #
478
529
  ####################################################################
479
530
  def dc_check_model(document, crash=false)
480
- return nil unless document.errors.any?
481
- msg = ''
482
- document.errors.each do |attribute, errors_array|
483
- msg << "#{attribute}: #{errors_array}\n"
484
- end
485
- logger.debug(msg) if msg.size > 0
486
- crash_it if crash
487
- msg
531
+ DrgCms.model_check(document, crash)
488
532
  end
489
533
 
490
534
  ######################################################################
@@ -508,7 +552,7 @@ end
508
552
  # can be found in drg_cms.js file.
509
553
  #
510
554
  # @param [Hash] Options
511
- #
555
+ #
512
556
  # @return [JSON Response] Formatted to be used for ajax return.
513
557
  #
514
558
  # @example
@@ -520,7 +564,7 @@ end
520
564
  ######################################################################
521
565
  def dc_render_ajax(opts)
522
566
  result = {}
523
- if opts[:div] or opts[:class]
567
+ if opts[:div] || opts[:class]
524
568
  selector = opts[:div] ? '#' : '.' # for div . for class
525
569
  key = case
526
570
  when opts[:prepend] then "#{selector}+div"
@@ -529,11 +573,11 @@ def dc_render_ajax(opts)
529
573
  end
530
574
  key << "_#{opts[:div]}#{opts[:class]}"
531
575
  else
532
- p 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
576
+ logger.error 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
533
577
  key = "#{opts[:operation]}_"
534
578
  end
535
579
  result[key] = opts[:value] || opts[:url] || ''
536
- render inline: result.to_json, formats: 'js'
580
+ render json: result
537
581
  end
538
582
 
539
583
  ########################################################################
@@ -542,7 +586,7 @@ end
542
586
  # @param [String] Table (collection) name. Could be dc_page;dc_part;... when searching for embedded document.
543
587
  # @param [String] Id of the document
544
588
  # @param [String] Ids of parent documents when document is embedded. Ids are separated by ; char.
545
- #
589
+ #
546
590
  # @return [document]. Required document or nil if not found.
547
591
  #
548
592
  # @example As used in Cmsedit_controller
@@ -587,25 +631,34 @@ def clear_login_data
587
631
  session[:edit_mode] = 0
588
632
  session[:user_id] = nil
589
633
  session[:user_name] = nil
590
- session[:user_roles] = nil
634
+ set_default_guest_user_role
591
635
  cookies.delete :remember_me
592
636
  end
593
637
 
638
+ ############################################################################
639
+ # Sets at least default guest user to user roles when no user is set.
640
+ ############################################################################
641
+ def set_default_guest_user_role
642
+ guest = DcPolicyRole.find_by(system_name: 'guest')
643
+ session[:user_roles] = [guest.id] if guest
644
+ end
645
+
594
646
  ####################################################################
595
647
  # Fills session with data related to successful login.
596
- #
648
+ #
597
649
  # @param [DcUser] user : User's document
598
650
  # @param [Boolean] remember_me : false by default
599
651
  ####################################################################
600
652
  def fill_login_data(user, remember_me=false)
601
653
  session[:user_id] = user.id if user
602
654
  session[:user_name] = user.name if user
603
- session[:edit_mode] = 0
655
+ session[:edit_mode] = 0
604
656
  session[:user_roles] = []
605
657
  # Every user has guest role
606
- guest = DcPolicyRole.find_by(system_name: 'guest')
607
- session[:user_roles] << guest.id if guest
608
- return unless user and user.active
658
+ # guest = DcPolicyRole.find_by(system_name: 'guest')
659
+ # session[:user_roles] << guest.id if guest
660
+ set_default_guest_user_role
661
+ return unless user and user.active
609
662
  # special for SUPERADMIN
610
663
  sa = DcPolicyRole.find_by(system_name: 'superadmin')
611
664
  if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
@@ -617,7 +670,7 @@ def fill_login_data(user, remember_me=false)
617
670
  policy_site = dc_get_site()
618
671
  policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
619
672
  default_policy = policy_site.dc_policies.find_by(is_default: true)
620
- # load user roles
673
+ # load user roles
621
674
  user.dc_user_roles.each do |role|
622
675
  next unless role.active
623
676
  next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
@@ -625,7 +678,7 @@ def fill_login_data(user, remember_me=false)
625
678
  # check if role is active in this site
626
679
  policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
627
680
  next unless policy_role
628
- # set edit_mode
681
+ # set edit_mode
629
682
  session[:edit_mode] = 1 if policy_role.permission > 1
630
683
  session[:user_roles] << role.dc_policy_role_id
631
684
  end
@@ -635,15 +688,75 @@ def fill_login_data(user, remember_me=false)
635
688
  end
636
689
  end
637
690
 
691
+ ####################################################################
692
+ # Fills session with data related to successful login.
693
+ #
694
+ # @param [DcUser] user : User's document
695
+ # @param [Boolean] remember_me : false by default
696
+ ####################################################################
697
+ def fill_login_data(user, remember_me = false)
698
+ session[:user_id] = user.id if user
699
+ session[:user_name] = user.name if user
700
+ session[:edit_mode] = 0
701
+ set_default_guest_user_role
702
+ return unless user&.active
703
+
704
+ # special for SUPERADMIN
705
+ sa = DcPolicyRole.find_by(system_name: 'superadmin')
706
+ if sa && (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
707
+ session[:user_roles] << role.dc_policy_role_id
708
+ session[:edit_mode] = 2
709
+ return
710
+ end
711
+ # read default policy from site. Policy might be inherited from other site
712
+ policy_site = dc_get_site()
713
+ policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
714
+ default_policy = policy_site.dc_policies.find_by(is_default: true)
715
+
716
+ # load user roles from groups
717
+ roles = {}
718
+ user.member.each do |group_id|
719
+ group = DcUser.find(group_id)
720
+ next unless group.active
721
+
722
+ group.dc_user_roles.each do |role|
723
+ next unless role.active?
724
+ roles[role.dc_policy_role_id] = role
725
+ end
726
+ end unless user.member.blank?
727
+
728
+ # load user roles from user
729
+ user.dc_user_roles.each do |role|
730
+ # not active in user roles will remove role defined in groups
731
+ unless role.active?
732
+ roles.delete(role.dc_policy_role_id) if roles[role.dc_policy_role_id]
733
+ next
734
+ end
735
+ roles[role.dc_policy_role_id] = role
736
+ end
737
+ # select only roles defined in default site policy and set edit_mode
738
+ roles.each do |key, role|
739
+ # check if role is active in this site
740
+ policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
741
+ next unless policy_role
742
+ # set edit_mode
743
+ session[:edit_mode] = 1 if policy_role.permission > 1
744
+ session[:user_roles] << role.dc_policy_role_id
745
+ end
746
+ # Save remember me cookie if not CMS user and remember me is selected
747
+ if session[:edit_mode] == 0 && remember_me
748
+ cookies.signed[:remember_me] = { value: user.id, expires: 180.days.from_now }
749
+ end
750
+ end
751
+
638
752
  ##########################################################################
639
- # Will check if user's login data is stil valid and reload user roles.
753
+ # Will check if user's login data is still valid and reload user roles.
640
754
  #
641
755
  # @param [Time] repeat_after : Check is repeated after time. This is by default performed every 24 hours.
642
756
  ##########################################################################
643
- def dc_check_user_still_valid(repeat_after=1.day)
644
- # not needed
645
- return if session[:user_id].nil?
646
- # last check more than a day ago
757
+ def dc_check_user_still_valid(repeat_after = 1.day)
758
+ return if session[:user_id].nil?
759
+ # last check more than repeat_after ago
647
760
  if (session[:user_chk] ||= Time.now) < repeat_after.ago
648
761
  user_id = session[:user_id]
649
762
  clear_login_data
@@ -654,4 +767,158 @@ def dc_check_user_still_valid(repeat_after=1.day)
654
767
  end
655
768
  end
656
769
 
770
+ ##########################################################################
771
+ # Evaluates Class.method in more predictable context then just calling eval
772
+ #
773
+ # @param [String] class_method defined as MyClass.method_name
774
+ # @param [Object] optional parameters send to class_method
775
+ ##########################################################################
776
+ def dc_eval_class_method(class_method, params = nil)
777
+ klass, method = class_method.split('.')
778
+ # check if class exists
779
+ klass = klass.classify.constantize rescue nil
780
+ if klass.nil?
781
+ logger.error " Class in #{class_method} not defined!"
782
+ return nil
783
+ end
784
+ # call method
785
+ if klass.respond_to?(method)
786
+ klass.send(method, params)
787
+ else
788
+ logger.error "Method in #{class_method} not defined!"
789
+ nil
790
+ end
791
+ end
792
+
793
+ ##########################################################################
794
+ # Will add new element to json_ld structure
795
+ #
796
+ # Parameters:
797
+ # [element] Hash or Array of hashes:
798
+ ##########################################################################
799
+ def dc_add_json_ld(element)
800
+ @json_ld ||= []
801
+ if element.class == Array
802
+ @json_ld += element
803
+ else
804
+ @json_ld << element
805
+ end
806
+ end
807
+
808
+ ########################################################################
809
+ # Will add a meta tag to internal hash structure. If meta tag already exists it
810
+ # will be overwritten.
811
+ #
812
+ # Parameters:
813
+ # [name] String: meta name
814
+ # [content] String: meta content
815
+ #
816
+ ########################################################################
817
+ def dc_add_meta_tag(type, name, content)
818
+ return if content.blank?
819
+
820
+ @meta_tags ||= {}
821
+ key = "#{type}=\"#{name}\""
822
+ @meta_tags[key] = content
823
+ end
824
+
825
+ ########################################################################
826
+ # Will prepare flash[:update] data, which will be used for updating fields
827
+ # on forms parent form fields.
828
+ #
829
+ # Parameters:
830
+ # [field_name] String: Field name
831
+ # [value] String: New value
832
+ # [readonly] Boolean: Field is readonly
833
+ #
834
+ ########################################################################
835
+ def dc_update_form_field(field_name, value, readonly=false)
836
+ dc_deprecate('dc_update_form_field will be deprecated. Use dc_update_form_element instead.')
837
+ key_name = (readonly ? 'td_' : '') + "record_#{field_name}"
838
+ flash[:update] ||= {}
839
+ flash[:update][key_name] = value
840
+ end
841
+
842
+ ########################################################################
843
+ # Will prepare flash[:update] data, which will be used for updating elements
844
+ # on parent form.
845
+ #
846
+ # dc_update_form_field will be deprecated eventually.
847
+ #
848
+ # Parameters passed as hash:
849
+ # [field] String: Field name
850
+ # [head] String: Filed name in head of form
851
+ # [value] String: New value
852
+ # [readonly] Boolean: Field is readonly
853
+ #
854
+ ########################################################################
855
+ def dc_update_form_element(field: nil, head: nil, value:, readonly: true)
856
+ key = if field
857
+ (readonly ? 'td_' : '') + "record_#{field}"
858
+ elsif head
859
+ "head-#{head}"
860
+ end
861
+
862
+ if key
863
+ flash[:update] ||= {}
864
+ flash[:update][key] = value
865
+ end
866
+ end
867
+
868
+ ####################################################################
869
+ # Checks if any errors exist on document and writes error log. It can also
870
+ # crash if requested. This is mostly usefull in development for debuging
871
+ # model errors or when updating multiple collections and each save must be
872
+ # checked if succesfull.
873
+ #
874
+ # @param [Document] Document object which will be checked
875
+ # @param [Boolean] If true method should end in runtime error. Default = false.
876
+ #
877
+ # @return [String] Error messages or empty string if everything is OK.
878
+ #
879
+ # @Example Check for error when data is saved.
880
+ # model.save
881
+ # if (msg = DcApplicationController.dc_check_model(model) ).size > 0
882
+ # p msg
883
+ # error process ......
884
+ # end
885
+ #
886
+ ####################################################################
887
+ def self.dc_check_model(document, crash = false)
888
+ DrgCms.model_check(document, crash)
889
+ end
890
+
891
+ ########################################################################
892
+ # Will dump exception to rails log and console.
893
+ #
894
+ # Parameters:
895
+ # [exception] Object: Exception caught
896
+ #
897
+ ########################################################################
898
+ def dc_dump_exception(exception)
899
+ msg = [exception.message, *exception.backtrace].join($/)
900
+ pp msg
901
+ Rails.logger.error msg
902
+ end
903
+
904
+ private
905
+
906
+ ########################################################################
907
+ # Determines if redis cache store is active
908
+ #
909
+ # @return [Boolean] : True if redis cache store is active
910
+ ########################################################################
911
+ def redis_cache_store?
912
+ (Rails.application.config.cache_store.first == :redis_cache_store) rescue false
913
+ end
914
+
915
+ ########################################################################
916
+ # Returns redis object
917
+ #
918
+ # @return [Object] : Redis object
919
+ ########################################################################
920
+ def redis
921
+ Rails.cache.redis
922
+ end
923
+
657
924
  end