drg_cms 0.6.0.1 → 0.6.1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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