drg_cms 0.5.52.16 → 0.6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +446 -144
  3. data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
  4. data/app/assets/javascripts/drg_cms_application.js +1 -1
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +625 -243
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
  8. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  9. data/app/controllers/cmsedit_controller.rb +536 -331
  10. data/app/controllers/dc_application_controller.rb +380 -117
  11. data/app/controllers/dc_common_controller.rb +105 -14
  12. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  13. data/app/controls/dc_help_control.rb +126 -0
  14. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  15. data/app/controls/dc_poll_result_control.rb +88 -0
  16. data/app/controls/dc_report.rb +225 -0
  17. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  18. data/app/forms/all_options.yml +50 -9
  19. data/app/forms/cms_menu.yml +28 -18
  20. data/app/forms/dc_ad.yml +11 -22
  21. data/app/forms/dc_big_table.yml +1 -0
  22. data/app/forms/dc_big_table_value.yml +1 -0
  23. data/app/forms/dc_category.yml +2 -1
  24. data/app/forms/dc_design.yml +20 -16
  25. data/app/forms/dc_filter.yml +3 -6
  26. data/app/forms/dc_help_1.yml +109 -0
  27. data/app/forms/dc_journal.yml +3 -1
  28. data/app/forms/dc_json_ld.yml +59 -0
  29. data/app/forms/dc_key_value.yml +32 -0
  30. data/app/forms/dc_link.yml +1 -1
  31. data/app/forms/dc_menu.yml +2 -0
  32. data/app/forms/dc_menu_item.yml +2 -0
  33. data/app/forms/dc_page.yml +3 -5
  34. data/app/forms/dc_part.yml +1 -0
  35. data/app/forms/dc_piece.yml +1 -0
  36. data/app/forms/dc_poll.yml +19 -9
  37. data/app/forms/dc_poll_item.yml +2 -1
  38. data/app/forms/dc_poll_result.yml +83 -0
  39. data/app/forms/dc_poll_result_export.yml +35 -0
  40. data/app/forms/dc_seo.yml +33 -0
  41. data/app/forms/dc_simple_menu.yml +2 -0
  42. data/app/forms/dc_site.yml +4 -12
  43. data/app/forms/dc_user.yml +27 -11
  44. data/app/forms/dc_user_role.yml +3 -0
  45. data/app/forms/json_ld_schema.yml +168 -0
  46. data/app/helpers/cms_common_helper.rb +376 -0
  47. data/app/helpers/cms_edit_helper.rb +506 -0
  48. data/app/helpers/cms_helper.rb +268 -0
  49. data/app/helpers/cms_index_helper.rb +576 -0
  50. data/app/helpers/dc_application_helper.rb +183 -271
  51. data/app/models/concerns/dc_page_concern.rb +40 -6
  52. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  53. data/app/models/concerns/dc_seo_concern.rb +66 -0
  54. data/app/models/concerns/dc_site_concern.rb +67 -44
  55. data/app/models/concerns/dc_user_concern.rb +62 -21
  56. data/app/models/dc_design.rb +30 -18
  57. data/app/models/dc_filter.rb +22 -13
  58. data/app/models/dc_json_ld.rb +152 -0
  59. data/app/models/dc_key_value.rb +48 -0
  60. data/app/models/dc_key_value_store.rb +1 -0
  61. data/app/models/dc_memory.rb +8 -1
  62. data/app/models/dc_page.rb +0 -1
  63. data/app/models/dc_permission.rb +49 -9
  64. data/app/models/dc_policy.rb +25 -14
  65. data/app/models/dc_policy_role.rb +22 -11
  66. data/app/models/dc_poll.rb +39 -19
  67. data/app/models/{drgcms_form_fields/drgcms_form_fields.rb → dc_poll_result.rb} +23 -2
  68. data/app/models/dc_temp.rb +140 -0
  69. data/app/models/dc_user_role.rb +2 -2
  70. data/app/models/drgcms_form_fields.rb +14 -6
  71. data/app/models/drgcms_form_fields/action.rb +61 -0
  72. data/app/models/drgcms_form_fields/check_box.rb +3 -0
  73. data/app/models/drgcms_form_fields/comment.rb +8 -4
  74. data/app/models/drgcms_form_fields/date_picker.rb +11 -9
  75. data/app/models/drgcms_form_fields/date_select.rb +1 -1
  76. data/app/models/drgcms_form_fields/{date_time_picker.rb → datetime_picker.rb} +12 -10
  77. data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
  78. data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
  79. data/app/models/drgcms_form_fields/embedded.rb +26 -16
  80. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  81. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  82. data/app/models/drgcms_form_fields/hash_field.rb +90 -0
  83. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  84. data/app/models/drgcms_form_fields/html_field.rb +1 -1
  85. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  86. data/app/models/drgcms_form_fields/method.rb +66 -0
  87. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
  88. data/app/models/drgcms_form_fields/number_field.rb +15 -6
  89. data/app/models/drgcms_form_fields/radio.rb +96 -0
  90. data/app/models/drgcms_form_fields/readonly.rb +2 -2
  91. data/app/models/drgcms_form_fields/select.rb +92 -29
  92. data/app/models/drgcms_form_fields/text_area.rb +1 -1
  93. data/app/models/drgcms_form_fields/text_autocomplete.rb +29 -17
  94. data/app/models/drgcms_form_fields/text_field.rb +1 -1
  95. data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
  96. data/app/models/drgcms_form_fields/tree_select.rb +29 -10
  97. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  98. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  99. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  100. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  101. data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
  102. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  103. data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
  104. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  105. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  106. data/app/{helpers → renderers}/dc_poll_renderer.rb +84 -48
  107. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  108. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  109. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  110. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  111. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  112. data/app/views/cmsedit/_form.html.erb +4 -3
  113. data/app/views/cmsedit/_result.html.erb +2 -3
  114. data/app/views/cmsedit/edit.html.erb +4 -1
  115. data/app/views/cmsedit/index.html.erb +7 -1
  116. data/app/views/cmsedit/new.html.erb +3 -1
  117. data/app/views/dc_common/_help.html.erb +8 -0
  118. data/app/views/layouts/models.html.erb +2 -1
  119. data/config/locales/drgcms_en.yml +26 -3
  120. data/config/locales/drgcms_sl.yml +31 -5
  121. data/config/locales/models_en.yml +66 -18
  122. data/config/locales/models_sl.yml +71 -20
  123. data/drg_cms.gemspec +3 -3
  124. data/lib/drg_cms.rb +63 -1
  125. data/lib/drg_cms/version.rb +2 -2
  126. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  127. data/lib/tasks/database.rake +6 -56
  128. metadata +81 -63
  129. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  130. data/app/helpers/application_helper.rb +0 -2
  131. data/app/helpers/cmsedit_helper.rb +0 -885
  132. data/app/models/dc_dummy.rb +0 -102
  133. 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
  #
@@ -65,13 +64,9 @@ end
65
64
  # if dc_user_has_role('Site editors') ...
66
65
  ####################################################################
67
66
  def dc_user_has_role(role)
68
- if role.class == String
69
- rol = role
70
- role = DcPolicyRole.find_by(name: rol)
71
- role = DcPolicyRole.find_by(system_name: rol) if role.nil?
72
- end
73
- return false if role.nil? or session[:user_roles].nil?
74
- # role is found in user_roles
67
+ role = DcPolicyRole.get_role(role)
68
+ return false if role.nil? || session[:user_roles].nil?
69
+ # role exists in user_roles
75
70
  session[:user_roles].include?(role._id)
76
71
  end
77
72
 
@@ -85,22 +80,28 @@ end
85
80
  # @example Returns Google analytics code from site settings
86
81
  # settings = dc_get_site.params['ga_acc']
87
82
  ####################################################################
88
- def dc_get_site()
89
- return @site if @site
83
+ def dc_get_site
84
+ return @site if @site
85
+
90
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
+
91
92
  @site = DcSite.find_by(name: uri.host)
92
- # Site can be aliased
93
- if @site and !@site.alias_for.blank?
93
+ # Site can be aliased
94
+ if @site && !@site.alias_for.blank?
94
95
  @site = DcSite.find_by(name: @site.alias_for)
95
96
  end
96
- # Development environment. Check if site with name test exists and use
97
- # alias_for as pointer to real site.
98
- 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'
99
100
  @site = DcSite.find_by(name: 'test')
100
101
  @site = DcSite.find_by(name: @site.alias_for) if @site
101
- end
102
- @site = nil if @site and !@site.active # site is disabled
103
- @site
102
+ end
103
+ @site = nil if @site && !@site.active # site is disabled
104
+ dc_cache_write(cache_key, @site)
104
105
  end
105
106
 
106
107
  ##########################################################################
@@ -108,8 +109,9 @@ end
108
109
  #
109
110
  # Sets internal @page_title variable.
110
111
  ##########################################################################
111
- def set_page_title()
112
- @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)
113
115
  end
114
116
 
115
117
  ########################################################################
@@ -118,21 +120,19 @@ end
118
120
  # @param [String] Form file name. File name can be passed as gem_name.filename. This can
119
121
  # be useful when you are extending form but want to retain same name as original form
120
122
  # For example. You are extending dc_user form from drg_cms gem and want to
121
- # 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.
122
124
  #
123
125
  # @return [String] Form file name including path or nil if not found.
124
126
  ########################################################################
125
127
  def dc_find_form_file(form_file)
126
- form_path=nil
127
- if form_file.match(/\.|\//)
128
- form_path,form_file=form_file.split(/\.|\//)
129
- end
128
+ form_path = nil
129
+ form_path, form_file = form_file.split(/\.|\//) if form_file.match(/\.|\//)
130
+
130
131
  DrgCms.paths(:forms).reverse.each do |path|
131
132
  f = "#{path}/#{form_file}.yml"
132
- 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))
133
134
  end
134
- p "Form file #{form_file} not found!"
135
- nil
135
+ raise "Exception: Form file '#{form_file}' not found!"
136
136
  end
137
137
 
138
138
  #######################################################################
@@ -145,8 +145,8 @@ end
145
145
  # return dc_render_404('Site') unless site
146
146
  ########################################################################
147
147
  def dc_render_404(where_the_error_is=nil)
148
- logger.info("Error 404: path=#{params[:path]} site=#{@site.name if @site} page=#{@page.subject if @page} design=#{@design}")
149
- render(file: "#{Rails.root}/public/404", :status => 404, :layout => false, :formats => [:html])
148
+ logger.info("Error 404;#{request.env['REQUEST_URI'] rescue ''};#{request.referer};#{where_the_error_is}")
149
+ render(file: Rails.root.join('public/404.html'), status: 404)
150
150
  end
151
151
 
152
152
  ########################################################################
@@ -169,15 +169,7 @@ end
169
169
 
170
170
  protected
171
171
 
172
- #############################################################################
173
- # Add permissions. Subroutine of dc_user_can
174
- ############################################################################
175
- def add_permissions_for(table_name=nil) # :nodoc:
176
- perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
177
- (perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
178
- end
179
-
180
- ############################################################################
172
+ ###########################################################################
181
173
  # Checks if user can perform (read, create, edit, delete) document in specified
182
174
  # table (collection).
183
175
  #
@@ -189,26 +181,75 @@ end
189
181
  # @Example True when user has view permission on the table
190
182
  # if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
191
183
  ############################################################################
192
- def dc_user_can(permission, table=params[:table])
193
- if @permissions.nil?
194
- @permissions = {}
195
- add_permissions_for # default permission
196
- table_name = ''
197
- # permission can be set for table or object embedded in table. Read all possible values
198
- table.strip.downcase.split(';').each do |t|
199
- table_name << (table_name.size > 0 ? ';' : '') + t # table;embedded;another;...
200
- add_permissions_for table_name
201
- 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)
202
196
  end
203
- # Return true if any of the permissions user has is higher or equal to requested permission
204
- 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 }
205
198
  false
206
- 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
207
248
 
208
249
  ####################################################################
209
- # Detects if called from mobile agent according to http://detectmobilebrowsers.com/
250
+ # Detects if called from mobile agent according to http://detectmobilebrowsers.com/
210
251
  # and set session[:is_mobile]
211
- #
252
+ #
212
253
  # Detect also if caller is a robot and set session[:is_robot]
213
254
  ####################################################################
214
255
  def dc_set_is_mobile
@@ -216,13 +257,12 @@ def dc_set_is_mobile
216
257
  : false
217
258
  session[:is_mobile] = is_mobile ? 1 : 0
218
259
  #
219
- 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?:\/\/.*\)/)
220
261
  logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
221
262
  session[:is_robot] = true
222
263
  end
223
264
  end
224
265
 
225
-
226
266
  ##########################################################################
227
267
  # Merge values from parameters fields (from site, page ...) into internal @options hash.
228
268
  #
@@ -285,28 +325,32 @@ def get_design_and_render(design_doc)
285
325
  site_top = '<%= dc_page_top %>'
286
326
  site_bottom = '<%= dc_page_bottom %>'
287
327
  # lets try the rails way
288
- if @options[:control] and @options[:action]
328
+ if @options[:control] && @options[:action]
289
329
  controller = "#{@options[:control]}_control".classify.constantize rescue nil
290
330
  extend controller if controller
291
331
  return send @options[:action] if respond_to?(@options[:action])
292
332
  end
293
- #
333
+ # design doc present
294
334
  if design_doc
295
- if !design_doc.rails_view.blank?
296
- if design_doc.rails_view.downcase != 'site'
297
- return render design_doc.rails_view, layout: layout
298
- end
299
- elsif !design_doc.body.blank?
300
- design = site_top + design_doc.body + site_bottom
301
- 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
302
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?
303
346
  end
304
- #
305
- if @site.rails_view.blank?
347
+ # Design doc not defined
348
+ if @site.rails_view.blank?
306
349
  design = site_top + @site.design + site_bottom
307
- return render(inline: design, layout: layout)
308
- end
309
- render @site.rails_view, layout: layout
350
+ render(inline: design, layout: layout)
351
+ else
352
+ render @site.rails_view, layout: layout
353
+ end
310
354
  end
311
355
 
312
356
  ##########################################################################
@@ -323,34 +367,34 @@ end
323
367
  # dc_process_default_request
324
368
  # end
325
369
  ##########################################################################
326
- def dc_process_default_request()
370
+ def dc_process_default_request
327
371
  session[:edit_mode] ||= 0
328
- # Initialize parts
372
+ # Initialize parts
329
373
  @parts = nil
330
374
  @js, @css = '', ''
331
- # find domain name in sites
375
+ # find domain name in sites
332
376
  @site = dc_get_site
333
- # site not defined. render 404 error
377
+ # site not defined. render 404 error
334
378
  return dc_render_404('Site!') if @site.nil?
379
+
335
380
  dc_set_options(@site.settings)
336
- # HOMEPAGE. When no parameters is set
381
+ # HOMEPAGE. When no parameters is set
337
382
  params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
338
- @options[:path] = params[:path].to_s.split('/')
383
+ @options[:path] = params[:path].to_s.downcase.split('/')
339
384
  params[:path] = @options[:path].first if @options[:path].size > 1
340
- # some other process request. It should fail if not defined
385
+ # some other process request. It should fail if not defined
341
386
  return send(@site.request_processor) unless @site.request_processor.blank?
342
-
343
- # Search for page
344
- pageclass = @site.page_table.classify.constantize
387
+ # Search for page
388
+ pageclass = @site.page_klass
345
389
  if params[:id]
346
390
  #Page.where(id: params[:id]).or(subject_link: params[:id]).first
347
391
  @page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
348
392
  @page = pageclass.find(params[:id]) if @page.nil? # I think that there will be more subject_link searchers than id
349
393
  elsif params[:path]
350
- # path may point direct to page's subject_link
394
+ # path may point direct to page's subject_link
351
395
  @page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:path], active: true)
352
396
  if @page.nil?
353
- # no. Find if defined in links
397
+ # no. Find if defined in links
354
398
  link = DcLink.find_by(:dc_site_id.in => [@site._id, nil], name: params[:path])
355
399
  if link
356
400
  #pageclass.find_by(alt_link: params[:path])
@@ -359,29 +403,32 @@ def dc_process_default_request()
359
403
  end
360
404
  end
361
405
  end
362
- # if @page is not found render 404 error
406
+ # if @page is not found render 404 error
363
407
  return dc_render_404('Page!') unless @page
364
- dc_set_options @page.params
365
408
  dc_set_is_mobile unless session[:is_mobile] # do it only once per session
366
- # find design if defined. Otherwise design MUST be declared in site
409
+ # find design if defined. Otherwise design MUST be declared in site
367
410
  if @page.dc_design_id
368
411
  @design = DcDesign.find(@page.dc_design_id)
369
412
  return dc_render_404('Design!') unless @design
370
413
  end
371
- # 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
372
418
  if session[:edit_mode] > 0
373
419
  session[:site_id] = @site.id
374
- session[:site_page_table] = @site.page_table
420
+ session[:site_page_class] = @site.page_class
375
421
  session[:page_id] = @page.id
376
- else
377
- # Log only visits from non-editors
422
+ else
423
+ # Log only visits from non-editors
378
424
  dc_log_visit()
379
425
  end
380
426
  set_page_title()
381
427
  get_design_and_render @design
382
428
  end
383
429
 
384
- ##########################################################################
430
+ ######
431
+ # ####################################################################
385
432
  # Single site document kind of request handler.
386
433
  #
387
434
  # This request handler assumes that all data for the site is saved in the site document.
@@ -462,7 +509,7 @@ eot
462
509
  end
463
510
 
464
511
  ####################################################################
465
- # 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
466
513
  # crash if requested. This is mostly usefull in development for debuging
467
514
  # model errors or when saving to multiple collections and where each save must be
468
515
  # checked if succesfull.
@@ -481,14 +528,7 @@ end
481
528
  #
482
529
  ####################################################################
483
530
  def dc_check_model(document, crash=false)
484
- return nil unless document.errors.any?
485
- msg = ''
486
- document.errors.each do |attribute, errors_array|
487
- msg << "#{attribute}: #{errors_array}\n"
488
- end
489
- logger.debug(msg) if msg.size > 0
490
- crash_it if crash
491
- msg
531
+ DrgCms.check_model(document, crash=false)
492
532
  end
493
533
 
494
534
  ######################################################################
@@ -512,7 +552,7 @@ end
512
552
  # can be found in drg_cms.js file.
513
553
  #
514
554
  # @param [Hash] Options
515
- #
555
+ #
516
556
  # @return [JSON Response] Formatted to be used for ajax return.
517
557
  #
518
558
  # @example
@@ -524,7 +564,7 @@ end
524
564
  ######################################################################
525
565
  def dc_render_ajax(opts)
526
566
  result = {}
527
- if opts[:div] or opts[:class]
567
+ if opts[:div] || opts[:class]
528
568
  selector = opts[:div] ? '#' : '.' # for div . for class
529
569
  key = case
530
570
  when opts[:prepend] then "#{selector}+div"
@@ -533,11 +573,11 @@ def dc_render_ajax(opts)
533
573
  end
534
574
  key << "_#{opts[:div]}#{opts[:class]}"
535
575
  else
536
- 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?
537
577
  key = "#{opts[:operation]}_"
538
578
  end
539
579
  result[key] = opts[:value] || opts[:url] || ''
540
- render inline: result.to_json, formats: 'js'
580
+ render json: result
541
581
  end
542
582
 
543
583
  ########################################################################
@@ -546,7 +586,7 @@ end
546
586
  # @param [String] Table (collection) name. Could be dc_page;dc_part;... when searching for embedded document.
547
587
  # @param [String] Id of the document
548
588
  # @param [String] Ids of parent documents when document is embedded. Ids are separated by ; char.
549
- #
589
+ #
550
590
  # @return [document]. Required document or nil if not found.
551
591
  #
552
592
  # @example As used in Cmsedit_controller
@@ -591,25 +631,34 @@ def clear_login_data
591
631
  session[:edit_mode] = 0
592
632
  session[:user_id] = nil
593
633
  session[:user_name] = nil
594
- session[:user_roles] = nil
634
+ set_default_guest_user_role
595
635
  cookies.delete :remember_me
596
636
  end
597
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
+
598
646
  ####################################################################
599
647
  # Fills session with data related to successful login.
600
- #
648
+ #
601
649
  # @param [DcUser] user : User's document
602
650
  # @param [Boolean] remember_me : false by default
603
651
  ####################################################################
604
652
  def fill_login_data(user, remember_me=false)
605
653
  session[:user_id] = user.id if user
606
654
  session[:user_name] = user.name if user
607
- session[:edit_mode] = 0
655
+ session[:edit_mode] = 0
608
656
  session[:user_roles] = []
609
657
  # Every user has guest role
610
- guest = DcPolicyRole.find_by(system_name: 'guest')
611
- session[:user_roles] << guest.id if guest
612
- 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
613
662
  # special for SUPERADMIN
614
663
  sa = DcPolicyRole.find_by(system_name: 'superadmin')
615
664
  if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
@@ -621,7 +670,7 @@ def fill_login_data(user, remember_me=false)
621
670
  policy_site = dc_get_site()
622
671
  policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
623
672
  default_policy = policy_site.dc_policies.find_by(is_default: true)
624
- # load user roles
673
+ # load user roles
625
674
  user.dc_user_roles.each do |role|
626
675
  next unless role.active
627
676
  next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
@@ -629,7 +678,7 @@ def fill_login_data(user, remember_me=false)
629
678
  # check if role is active in this site
630
679
  policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
631
680
  next unless policy_role
632
- # set edit_mode
681
+ # set edit_mode
633
682
  session[:edit_mode] = 1 if policy_role.permission > 1
634
683
  session[:user_roles] << role.dc_policy_role_id
635
684
  end
@@ -639,15 +688,75 @@ def fill_login_data(user, remember_me=false)
639
688
  end
640
689
  end
641
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
+
642
752
  ##########################################################################
643
- # 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.
644
754
  #
645
755
  # @param [Time] repeat_after : Check is repeated after time. This is by default performed every 24 hours.
646
756
  ##########################################################################
647
- def dc_check_user_still_valid(repeat_after=1.day)
648
- # not needed
649
- return if session[:user_id].nil?
650
- # 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
651
760
  if (session[:user_chk] ||= Time.now) < repeat_after.ago
652
761
  user_id = session[:user_id]
653
762
  clear_login_data
@@ -658,4 +767,158 @@ def dc_check_user_still_valid(repeat_after=1.day)
658
767
  end
659
768
  end
660
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
+
661
924
  end