drg_cms 0.5.52.12 → 0.6.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
  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 +476 -215
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
  8. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  9. data/app/controllers/cmsedit_controller.rb +474 -233
  10. data/app/controllers/dc_application_controller.rb +264 -41
  11. data/app/controllers/dc_common_controller.rb +75 -63
  12. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  13. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  14. data/app/controls/dc_poll_result_control.rb +88 -0
  15. data/app/controls/dc_report.rb +227 -0
  16. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  17. data/app/forms/all_options.yml +70 -12
  18. data/app/forms/cms_menu.yml +26 -17
  19. data/app/forms/dc_ad.yml +11 -22
  20. data/app/forms/dc_big_table.yml +1 -0
  21. data/app/forms/dc_big_table_value.yml +1 -0
  22. data/app/forms/dc_design.yml +19 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_gallery.yml +53 -0
  25. data/app/forms/dc_json_ld.yml +59 -0
  26. data/app/forms/dc_key_value.yml +32 -0
  27. data/app/forms/dc_link.yml +16 -10
  28. data/app/forms/dc_menu_item.yml +6 -0
  29. data/app/forms/dc_page.yml +2 -7
  30. data/app/forms/dc_poll.yml +16 -9
  31. data/app/forms/dc_poll_item.yml +2 -1
  32. data/app/forms/dc_poll_result.yml +83 -0
  33. data/app/forms/dc_poll_result_export.yml +35 -0
  34. data/app/forms/dc_removed_url.yml +42 -0
  35. data/app/forms/dc_seo.yml +33 -0
  36. data/app/forms/dc_site.yml +2 -6
  37. data/app/forms/json_ld_schema.yml +168 -0
  38. data/app/helpers/cms_common_helper.rb +311 -0
  39. data/app/helpers/cms_edit_helper.rb +498 -0
  40. data/app/helpers/cms_helper.rb +230 -0
  41. data/app/helpers/cms_index_helper.rb +564 -0
  42. data/app/helpers/dc_application_helper.rb +195 -268
  43. data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
  44. data/app/models/concerns/dc_page_concern.rb +31 -6
  45. data/app/models/concerns/dc_seo_concern.rb +66 -0
  46. data/app/models/concerns/dc_site_concern.rb +12 -1
  47. data/app/models/concerns/dc_user_concern.rb +5 -3
  48. data/app/models/dc_design.rb +2 -0
  49. data/app/models/dc_filter.rb +37 -20
  50. data/app/models/dc_gallery.rb +64 -0
  51. data/app/models/dc_json_ld.rb +152 -0
  52. data/app/models/dc_key_value.rb +48 -0
  53. data/app/models/dc_link.rb +1 -0
  54. data/app/models/dc_memory.rb +26 -4
  55. data/app/models/dc_page.rb +1 -2
  56. data/app/models/dc_permission.rb +30 -0
  57. data/app/models/dc_poll.rb +39 -19
  58. data/app/models/dc_poll_result.rb +46 -0
  59. data/app/models/dc_removed_url.rb +54 -0
  60. data/app/models/dc_temp.rb +140 -0
  61. data/app/models/drgcms_form_fields.rb +6 -1642
  62. data/app/models/drgcms_form_fields/action.rb +61 -0
  63. data/app/models/drgcms_form_fields/check_box.rb +72 -0
  64. data/app/models/drgcms_form_fields/comment.rb +53 -0
  65. data/app/models/drgcms_form_fields/date_picker.rb +104 -0
  66. data/app/models/drgcms_form_fields/date_select.rb +68 -0
  67. data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
  68. data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
  69. data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
  70. data/app/models/drgcms_form_fields/embedded.rb +97 -0
  71. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  72. data/app/models/drgcms_form_fields/file_select.rb +70 -0
  73. data/app/models/drgcms_form_fields/hash_field.rb +86 -0
  74. data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
  75. data/app/models/drgcms_form_fields/html_field.rb +70 -0
  76. data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
  77. data/app/models/drgcms_form_fields/link_to.rb +69 -0
  78. data/app/models/drgcms_form_fields/method.rb +65 -0
  79. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
  80. data/app/models/drgcms_form_fields/number_field.rb +92 -0
  81. data/app/models/drgcms_form_fields/password_field.rb +62 -0
  82. data/app/models/drgcms_form_fields/radio.rb +96 -0
  83. data/app/models/drgcms_form_fields/readonly.rb +79 -0
  84. data/app/models/drgcms_form_fields/select.rb +226 -0
  85. data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
  86. data/app/models/drgcms_form_fields/text_area.rb +68 -0
  87. data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
  88. data/app/models/drgcms_form_fields/text_field.rb +56 -0
  89. data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
  90. data/app/models/drgcms_form_fields/tree_select.rb +169 -0
  91. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  92. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  93. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  94. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  95. data/app/renderers/dc_gallery_renderer.rb +95 -0
  96. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  97. data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
  98. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  99. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  100. data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
  101. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  102. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  103. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  104. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  105. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  106. data/app/views/cmsedit/_form.html.erb +4 -3
  107. data/app/views/cmsedit/_result.html.erb +2 -3
  108. data/app/views/cmsedit/edit.html.erb +2 -1
  109. data/app/views/cmsedit/index.html.erb +6 -1
  110. data/app/views/cmsedit/new.html.erb +1 -1
  111. data/config/locales/drgcms_en.yml +15 -3
  112. data/config/locales/drgcms_sl.yml +18 -6
  113. data/config/locales/models_en.yml +103 -19
  114. data/config/locales/models_sl.yml +102 -17
  115. data/drg_cms.gemspec +3 -3
  116. data/lib/drg_cms.rb +6 -2
  117. data/lib/drg_cms/version.rb +2 -2
  118. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  119. data/lib/tasks/database.rake +6 -56
  120. data/lib/tasks/dc_cleanup.rake +1 -1
  121. metadata +106 -61
  122. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  123. data/app/helpers/application_helper.rb +0 -2
  124. data/app/helpers/cmsedit_helper.rb +0 -844
  125. data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -65,11 +65,7 @@ end
65
65
  # if dc_user_has_role('Site editors') ...
66
66
  ####################################################################
67
67
  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
68
+ role = DcPolicyRole.get_role(role)
73
69
  return false if role.nil? or session[:user_roles].nil?
74
70
  # role is found in user_roles
75
71
  session[:user_roles].include?(role._id)
@@ -109,7 +105,8 @@ end
109
105
  # Sets internal @page_title variable.
110
106
  ##########################################################################
111
107
  def set_page_title()
112
- @page_title = @page.title.blank? ? "#{@page.subject} - #{@site.page_title}" : @page.title
108
+ @page_title = @page.title.blank? ? @page.subject : @page.title
109
+ dc_add_meta_tag(:name, 'description', @page.meta_description)
113
110
  end
114
111
 
115
112
  ########################################################################
@@ -131,8 +128,7 @@ def dc_find_form_file(form_file)
131
128
  f = "#{path}/#{form_file}.yml"
132
129
  return f if File.exist?(f) and (form_path.nil? or path.to_s.match(/\/#{form_path}\//i))
133
130
  end
134
- p "Form file #{form_file} not found!"
135
- nil
131
+ raise "Exception: Form file '#{form_file}' not found!"
136
132
  end
137
133
 
138
134
  #######################################################################
@@ -145,8 +141,8 @@ end
145
141
  # return dc_render_404('Site') unless site
146
142
  ########################################################################
147
143
  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])
144
+ logger.info("Error 404;#{request.env['REQUEST_URI'] rescue ''};#{request.referer};#{where_the_error_is}")
145
+ render(file: Rails.root.join('public/404.html'), status: 404)
150
146
  end
151
147
 
152
148
  ########################################################################
@@ -172,7 +168,7 @@ protected
172
168
  #############################################################################
173
169
  # Add permissions. Subroutine of dc_user_can
174
170
  ############################################################################
175
- def add_permissions_for(table_name=nil) # :nodoc:
171
+ def __add_permissions_for(table_name=nil) # :nodoc:
176
172
  perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
177
173
  (perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
178
174
  end
@@ -189,7 +185,7 @@ end
189
185
  # @Example True when user has view permission on the table
190
186
  # if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
191
187
  ############################################################################
192
- def dc_user_can(permission, table=params[:table])
188
+ def __dc_user_can(permission, table=params[:table])
193
189
  if @permissions.nil?
194
190
  @permissions = {}
195
191
  add_permissions_for # default permission
@@ -205,16 +201,42 @@ def dc_user_can(permission, table=params[:table])
205
201
  false
206
202
  end
207
203
 
204
+ ###########################################################################
205
+ # Checks if user can perform (read, create, edit, delete) document in specified
206
+ # table (collection).
207
+ #
208
+ # @param [Integer] Required permission level
209
+ # @param [String] Collection (table) name for which permission is queried. Defaults to params[table].
210
+ #
211
+ # @return [Boolean] true if user's role permits (is higher or equal then required) operation on a table (collection).
212
+ #
213
+ # @Example True when user has view permission on the table
214
+ # if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
215
+ ############################################################################
216
+ def dc_user_can(permission, table=params[:table])
217
+ @permissions ||= DcPermission.permissions_for_table(table)
218
+ # Return true if any of the permissions user has is higher or equal to requested permission
219
+ session[:user_roles].each {|r| return true if @permissions[r] and @permissions[r] >= permission }
220
+ false
221
+ end
222
+
208
223
  ####################################################################
209
- # Detects if called from mobile agent according to http://detectmobilebrowsers.com/
224
+ # Detects if called from mobile agent according to http://detectmobilebrowsers.com/
225
+ # and set session[:is_mobile]
226
+ #
227
+ # Detect also if caller is a robot and set session[:is_robot]
210
228
  ####################################################################
211
229
  def dc_set_is_mobile
212
230
  is_mobile = request.user_agent ? /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.match(request.user_agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.match(request.user_agent[0..3])
213
231
  : false
214
232
  session[:is_mobile] = is_mobile ? 1 : 0
233
+ #
234
+ if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
235
+ logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
236
+ session[:is_robot] = true
237
+ end
215
238
  end
216
239
 
217
-
218
240
  ##########################################################################
219
241
  # Merge values from parameters fields (from site, page ...) into internal @options hash.
220
242
  #
@@ -282,23 +304,27 @@ def get_design_and_render(design_doc)
282
304
  extend controller if controller
283
305
  return send @options[:action] if respond_to?(@options[:action])
284
306
  end
285
- #
307
+ # design doc present
286
308
  if design_doc
287
- if !design_doc.rails_view.blank?
288
- if design_doc.rails_view.downcase != 'site'
289
- return render design_doc.rails_view, layout: layout
290
- end
291
- elsif !design_doc.body.blank?
292
- design = site_top + design_doc.body + site_bottom
293
- return render(inline: design, layout: layout)
309
+ # defined as rails view
310
+ design = if design_doc.rails_view.blank? or design_doc.rails_view == 'site'
311
+ @site.rails_view
312
+ else
313
+ design_doc.rails_view
294
314
  end
315
+ return render design, layout: layout unless design.blank?
316
+ # defined as inline code
317
+ design = design_doc.body.blank? ? @site.design : design_doc.body
318
+ design = site_top + design + site_bottom
319
+ return render(inline: design, layout: layout) unless design.blank?
295
320
  end
296
- #
321
+ # Design doc not defined
297
322
  if @site.rails_view.blank?
298
323
  design = site_top + @site.design + site_bottom
299
- return render(inline: design, layout: layout)
300
- end
301
- render @site.rails_view, layout: layout
324
+ render(inline: design, layout: layout)
325
+ else
326
+ render @site.rails_view, layout: layout
327
+ end
302
328
  end
303
329
 
304
330
  ##########################################################################
@@ -327,13 +353,13 @@ def dc_process_default_request()
327
353
  dc_set_options(@site.settings)
328
354
  # HOMEPAGE. When no parameters is set
329
355
  params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
330
- @options[:path] = params[:path].to_s.split('/')
356
+ @options[:path] = params[:path].to_s.downcase.split('/')
331
357
  params[:path] = @options[:path].first if @options[:path].size > 1
332
358
  # some other process request. It should fail if not defined
333
359
  return send(@site.request_processor) unless @site.request_processor.blank?
334
360
 
335
361
  # Search for page
336
- pageclass = @site.page_table.classify.constantize
362
+ pageclass = @site.page_klass
337
363
  if params[:id]
338
364
  #Page.where(id: params[:id]).or(subject_link: params[:id]).first
339
365
  @page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
@@ -353,17 +379,19 @@ def dc_process_default_request()
353
379
  end
354
380
  # if @page is not found render 404 error
355
381
  return dc_render_404('Page!') unless @page
356
- dc_set_options @page.params
357
382
  dc_set_is_mobile unless session[:is_mobile] # do it only once per session
358
383
  # find design if defined. Otherwise design MUST be declared in site
359
384
  if @page.dc_design_id
360
385
  @design = DcDesign.find(@page.dc_design_id)
361
386
  return dc_render_404('Design!') unless @design
362
387
  end
388
+ dc_set_options @design.params if @design
389
+ dc_set_options @page.params
390
+ dc_add_json_ld(@page.get_json_ld)
363
391
  # Add edit menu
364
392
  if session[:edit_mode] > 0
365
393
  session[:site_id] = @site.id
366
- session[:site_page_table] = @site.page_table
394
+ session[:site_page_class] = @site.page_class
367
395
  session[:page_id] = @page.id
368
396
  else
369
397
  # Log only visits from non-editors
@@ -454,7 +482,7 @@ eot
454
482
  end
455
483
 
456
484
  ####################################################################
457
- # Checks if any errors exist on document and writes debug log. It can also
485
+ # Checks if any errors exist on document and writes error log. It can also
458
486
  # crash if requested. This is mostly usefull in development for debuging
459
487
  # model errors or when saving to multiple collections and where each save must be
460
488
  # checked if succesfull.
@@ -473,14 +501,7 @@ end
473
501
  #
474
502
  ####################################################################
475
503
  def dc_check_model(document, crash=false)
476
- return nil unless document.errors.any?
477
- msg = ''
478
- document.errors.each do |attribute, errors_array|
479
- msg << "#{attribute}: #{errors_array}\n"
480
- end
481
- logger.debug(msg) if msg.size > 0
482
- crash_it if crash
483
- msg
504
+ DcApplicationController.dc_check_model(document, crash=false)
484
505
  end
485
506
 
486
507
  ######################################################################
@@ -525,11 +546,11 @@ def dc_render_ajax(opts)
525
546
  end
526
547
  key << "_#{opts[:div]}#{opts[:class]}"
527
548
  else
528
- p 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
549
+ logger.error 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
529
550
  key = "#{opts[:operation]}_"
530
551
  end
531
552
  result[key] = opts[:value] || opts[:url] || ''
532
- render inline: result.to_json, formats: 'js'
553
+ render json: result
533
554
  end
534
555
 
535
556
  ########################################################################
@@ -576,4 +597,206 @@ def dc_deprecate(msg)
576
597
  ActiveSupport::Deprecation.warn("#{dc_get_site.name}: #{msg}")
577
598
  end
578
599
 
600
+ ####################################################################
601
+ # Clears all session data related to login.
602
+ ####################################################################
603
+ def clear_login_data
604
+ session[:edit_mode] = 0
605
+ session[:user_id] = nil
606
+ session[:user_name] = nil
607
+ session[:user_roles] = nil
608
+ cookies.delete :remember_me
609
+ end
610
+
611
+ ############################################################################
612
+ # Sets at least default guest user to user roles when no user is set.
613
+ ############################################################################
614
+ def set_default_guest_user_role
615
+ guest = DcPolicyRole.find_by(system_name: 'guest')
616
+ session[:user_roles] = [guest.id] if guest
617
+ end
618
+
619
+ ####################################################################
620
+ # Fills session with data related to successful login.
621
+ #
622
+ # @param [DcUser] user : User's document
623
+ # @param [Boolean] remember_me : false by default
624
+ ####################################################################
625
+ def fill_login_data(user, remember_me=false)
626
+ session[:user_id] = user.id if user
627
+ session[:user_name] = user.name if user
628
+ session[:edit_mode] = 0
629
+ session[:user_roles] = []
630
+ # Every user has guest role
631
+ # guest = DcPolicyRole.find_by(system_name: 'guest')
632
+ # session[:user_roles] << guest.id if guest
633
+ set_default_guest_user_role
634
+ return unless user and user.active
635
+ # special for SUPERADMIN
636
+ sa = DcPolicyRole.find_by(system_name: 'superadmin')
637
+ if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
638
+ session[:user_roles] << role.dc_policy_role_id
639
+ session[:edit_mode] = 2
640
+ return
641
+ end
642
+ # read default policy from site. Policy might be inherited
643
+ policy_site = dc_get_site()
644
+ policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
645
+ default_policy = policy_site.dc_policies.find_by(is_default: true)
646
+ # load user roles
647
+ user.dc_user_roles.each do |role|
648
+ next unless role.active
649
+ next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
650
+ next if role.valid_to and role.valid_to < Time.now.to_date
651
+ # check if role is active in this site
652
+ policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
653
+ next unless policy_role
654
+ # set edit_mode
655
+ session[:edit_mode] = 1 if policy_role.permission > 1
656
+ session[:user_roles] << role.dc_policy_role_id
657
+ end
658
+ # Save remember me cookie if not CMS user and remember me is selected
659
+ if session[:edit_mode] == 0 and remember_me
660
+ cookies.signed[:remember_me] = { :value => user.id, :expires => 180.days.from_now}
661
+ end
662
+ end
663
+
664
+ ##########################################################################
665
+ # Will check if user's login data is stil valid and reload user roles.
666
+ #
667
+ # @param [Time] repeat_after : Check is repeated after time. This is by default performed every 24 hours.
668
+ ##########################################################################
669
+ def dc_check_user_still_valid(repeat_after=1.day)
670
+ # not needed
671
+ return if session[:user_id].nil?
672
+ # last check more than a day ago
673
+ if (session[:user_chk] ||= Time.now) < repeat_after.ago
674
+ user_id = session[:user_id]
675
+ clear_login_data
676
+ # reload user roles
677
+ user = DcUser.find( user_id ) rescue nil
678
+ fill_login_data(user)
679
+ session[:user_chk] = Time.now
680
+ end
681
+ end
682
+
683
+ ##########################################################################
684
+ # Evaluates Class.method in more predictable context then just calling eval
685
+ #
686
+ # @param [String] class_method defined as MyClass.method_name
687
+ # @param [Object] optional parameters send to class_method
688
+ ##########################################################################
689
+ def dc_eval_class_method(class_method, params=nil)
690
+ klass, method = class_method.split('.')
691
+ # check if class exists
692
+ klass = klass.classify.constantize rescue nil
693
+ if klass.nil?
694
+ logger.error " Class in #{class_method} not defined!"
695
+ return nil
696
+ end
697
+ # call method
698
+ if klass.respond_to?(method)
699
+ klass.send(method, params)
700
+ else
701
+ logger.error "Method in #{class_method} not defined!"
702
+ nil
703
+ end
704
+ end
705
+
706
+ ##########################################################################
707
+ # Will add new element to json_ld structure
708
+ #
709
+ # Parameters:
710
+ # [element] Hash or Array of hashes:
711
+ ##########################################################################
712
+ def dc_add_json_ld(element)
713
+ @json_ld ||= []
714
+ if element.class == Array
715
+ @json_ld += element
716
+ else
717
+ @json_ld << element
718
+ end
719
+ end
720
+
721
+ ########################################################################
722
+ # Will add a meta tag to internal hash structure. If meta tag already exists it
723
+ # will be overwritten.
724
+ #
725
+ # Parameters:
726
+ # [name] String: meta name
727
+ # [content] String: meta content
728
+ #
729
+ ########################################################################
730
+ def dc_add_meta_tag(type, name, content)
731
+ return if content.blank?
732
+ @meta_tags ||= {}
733
+ key = "#{type}=\"#{name}\""
734
+ @meta_tags[key] = content
735
+ end
736
+
737
+ ########################################################################
738
+ # Will prepare flash[:update] data, which will be used for updating fields
739
+ # on forms parent form fields.
740
+ #
741
+ # Parameters:
742
+ # [field_name] String: Field name
743
+ # [value] String: New value
744
+ # [readonly] Boolean: Field is readonly
745
+ #
746
+ ########################################################################
747
+ def dc_update_form_field(field_name, value, readonly=false)
748
+ key_name = (readonly ? 'td_' : '') + "record_#{field_name}"
749
+ flash[:update] ||= {}
750
+ flash[:update][key_name] = value
751
+ end
752
+
753
+ ####################################################################
754
+ # Checks if any errors exist on document and writes error log. It can also
755
+ # crash if requested. This is mostly usefull in development for debuging
756
+ # model errors or when updating multiple collections and each save must be
757
+ # checked if succesfull.
758
+ #
759
+ # @param [Document] Document object which will be checked
760
+ # @param [Boolean] If true method should end in runtime error. Default = false.
761
+ #
762
+ # @return [String] Error messages or empty string if everything is OK.
763
+ #
764
+ # @Example Check for error when data is saved.
765
+ # model.save
766
+ # if (msg = DcApplicationController.dc_check_model(model) ).size > 0
767
+ # p msg
768
+ # error process ......
769
+ # end
770
+ #
771
+ ####################################################################
772
+ def self.dc_check_model(document, crash=false)
773
+ return nil unless document.errors.any?
774
+ msg = ""
775
+ document.errors.each do |attribute, errors_array|
776
+ msg << "#{attribute}: #{errors_array}\n"
777
+ end
778
+ #
779
+ if crash and msg.size > 0
780
+ msg = "Validation errors in #{document.class}:\n" + msg
781
+ pp msg
782
+ Rails.logger.error(msg)
783
+ raise "Validation error. See log for more information."
784
+ end
785
+ msg
786
+ end
787
+
788
+ ########################################################################
789
+ # Will dump exception to rails log and console.
790
+ #
791
+ # Parameters:
792
+ # [exception] Object: Exception caught
793
+ #
794
+ ########################################################################
795
+ def dc_dump_exception(exception)
796
+ msg = [exception.message, *exception.backtrace].join($/)
797
+ pp msg
798
+ Rails.logger.error msg
799
+ end
800
+
801
+
579
802
  end
@@ -45,7 +45,12 @@ layout false
45
45
  # JSON array [label, value, id] of first 20 documents that confirm to query.
46
46
  ########################################################################
47
47
  def autocomplete
48
- # return '' unless session[:edit_mode] > 0 #
48
+ # table parameter must be defined. If not, get it from search parameter
49
+ if params['table'].nil? and params['search'].match(/\./)
50
+ name = params['search'].split('.').first
51
+ params['table'] = name.underscore
52
+ end
53
+
49
54
  return render plain: t('drgcms.not_authorized') unless dc_user_can(DcPermission::CAN_VIEW)
50
55
  # TODO Double check if previous line works as it should.
51
56
  table = params['table'].classify.constantize
@@ -55,7 +60,7 @@ def autocomplete
55
60
  a = if params['search'].match(/\./)
56
61
  name, method = params['search'].split('.')
57
62
  table.send(method, params['input']).inject([]) do |r,v|
58
- r << { label: v[0], value: v[0], id: v[1].to_s }
63
+ r << { label: v[0], value: v[0], id: (v[1] || v[0]).to_s }
59
64
  end
60
65
  # simply search which will search and return field_name defined in params['search']
61
66
  else
@@ -64,7 +69,7 @@ def autocomplete
64
69
  end
65
70
  end
66
71
 
67
- render inline: a.to_json, formats: 'js'
72
+ render plain: a.to_json
68
73
  end
69
74
 
70
75
  ########################################################################
@@ -88,13 +93,24 @@ end
88
93
  ##########################################################################
89
94
  def toggle_edit_mode
90
95
  session[:edit_mode] ||= 0
91
- # called without logged in
92
- if session[:edit_mode] < 1
93
- dc_render_404
94
- else
95
- session[:edit_mode] = (session[:edit_mode] == 1) ? 2 : 1
96
- redirect_to params[:return_to]
96
+ # error when not logged in
97
+ return dc_render_404 if session[:edit_mode] < 1
98
+ # if return_to_ypos parameter is present it will forward it and thus scroll to
99
+ # aproximate position it was when toggle was clicked
100
+ session[:edit_mode] = (session[:edit_mode] == 1) ? 2 : 1
101
+ uri = Rack::Utils.parse_nested_query(request.url)
102
+ # it parses only on & so first (return_to) parameter also contains url
103
+ url = uri.first.last
104
+ if (i = url.index('return_to_ypos')).to_i > 0
105
+ url = url[0,i-1]
106
+ end
107
+ # offset CMS menu
108
+ if (ypos = uri['return_to_ypos'].to_i) > 0
109
+ ypos += session[:edit_mode] == 2 ? 250 : -250
97
110
  end
111
+ url << (url.match(/\?/) ? '&' : '?')
112
+ url << "return_to_ypos=#{ypos}"
113
+ redirect_to url
98
114
  end
99
115
 
100
116
  ####################################################################
@@ -105,7 +121,7 @@ def process_login
105
121
  return dc_render_404 unless ( params[:record] and params[:record][:username] and params[:record][:password] )
106
122
 
107
123
  unless params[:record][:password].blank? #password must not be empty
108
- user = DcUser.find_by(username: params[:record][:username])
124
+ user = DcUser.find_by(username: params[:record][:username], active: true)
109
125
  if user and user.authenticate(params[:record][:password])
110
126
  fill_login_data(user, params[:record][:remember_me].to_i == 1)
111
127
  return redirect_to params[:return_to] || '/'
@@ -130,7 +146,7 @@ end
130
146
  def login
131
147
  if cookies.signed[:remember_me]
132
148
  user = DcUser.find(cookies.signed[:remember_me])
133
- if user
149
+ if user and user.active
134
150
  fill_login_data(user, true)
135
151
  return redirect_to params[:return_to]
136
152
 
@@ -149,7 +165,7 @@ end
149
165
  def restore_from_journal
150
166
  # Only administrators can perform this operation
151
167
  unless dc_user_has_role('admin')
152
- return render inline: { 'msg_info' => (t ('drgcms.not_authorized')) }.to_json, formats: 'js'
168
+ return render plain: { 'msg_info' => (t ('drgcms.not_authorized')) }.to_json
153
169
  end
154
170
  # selected fields to hash
155
171
  restore = {}
@@ -178,7 +194,7 @@ def restore_from_journal
178
194
  # TODO Error checking
179
195
  { 'msg_info' => (t ('drgcms.dc_journal.restored')) }
180
196
  end
181
- render inline: result.to_json, formats: 'js'
197
+ render plain: result.to_json
182
198
  end
183
199
 
184
200
  ########################################################################
@@ -236,8 +252,54 @@ def paste_clipboard
236
252
  dc_render_ajax(div: 'result', value: result )
237
253
  end
238
254
 
255
+ ########################################################################
256
+ # Will add new json_ld element with blank structure into dc_json_ld field on a
257
+ # document.
258
+ ########################################################################
259
+ def add_json_ld_schema
260
+ edited_document = DcJsonLd.find_document_by_ids(params[:table], params[:ids])
261
+ yaml = YAML.load_file( dc_find_form_file('json_ld_schema') )
262
+ schema_data = yaml[params[:schema]]
263
+ # Existing document
264
+ if edited_document.dc_json_lds.find_by(type: "@#{params[:schema]}")
265
+ return render json: {'msg_error' => t('helpers.help.dc_json_ld.add_error', schema: params[:schema] ) }
266
+ else
267
+ add_empty_json_ld_schema(edited_document, schema_data, params[:schema], params[:schema], yaml)
268
+ end
269
+ render json: {'reload_' => 1}
270
+ end
271
+
239
272
  protected
240
273
 
274
+ ########################################################################
275
+ # Subroutine of add_json_ld_schema for adding one element
276
+ ########################################################################
277
+ def add_empty_json_ld_schema(edited_document, schema, schema_name, schema_type, yaml) #:nodoc
278
+ data = {}
279
+ doc = DcJsonLd.new
280
+ doc.name = schema_name
281
+ doc.type = schema_type
282
+
283
+ edited_document.dc_json_lds << doc
284
+ schema.each do |element_name, element|
285
+ next if element_name == 'level' # skip level element
286
+ if yaml[element['type']]
287
+ if element['n'].to_s == '1'
288
+ # single element
289
+ doc_1 = yaml[element['type'] ]
290
+ data[element_name] = doc_1
291
+ else
292
+ # array
293
+ add_empty_json_ld_schema(doc, yaml[element['type']], element_name, element['type'], yaml)
294
+ end
295
+ else
296
+ data[element_name] = element['text']
297
+ end
298
+ end
299
+ doc.data = data.to_yaml
300
+ doc.save
301
+ end
302
+
241
303
  ########################################################################
242
304
  # Update some anomalies in json data on paste_clipboard action.
243
305
  ########################################################################
@@ -282,54 +344,4 @@ def process_document(line, table, id, ids)
282
344
  msg ? " ERROR! #{msg}" : " NEW. OK."
283
345
  end
284
346
 
285
- ####################################################################
286
- # Clears all session data related to login.
287
- ####################################################################
288
- def clear_login_data
289
- session[:edit_mode] = 0
290
- session[:user_id] = nil
291
- session[:user_name] = nil
292
- session[:user_roles] = nil
293
- cookies.delete :remember_me
294
- end
295
-
296
- ####################################################################
297
- # Fills session with data related to successful login.
298
- ####################################################################
299
- def fill_login_data(user, remember_me)
300
- session[:user_id] = user.id
301
- session[:user_name] = user.name
302
- session[:edit_mode] = 0
303
- session[:user_roles] = []
304
-
305
- # special for SUPERADMIN
306
- sa = DcPolicyRole.find_by(system_name: 'superadmin')
307
- if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
308
- session[:user_roles] << role.dc_policy_role_id
309
- session[:edit_mode] = 2
310
- return
311
- end
312
- # Every user has guest role
313
- guest = DcPolicyRole.find_by(system_name: 'guest')
314
- session[:user_roles] << guest.id if guest
315
- # read default policy from site
316
- default_policy = dc_get_site().dc_policies.find_by(is_default: true)
317
- # load user roles
318
- user.dc_user_roles.each do |role|
319
- next unless role.active
320
- next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
321
- next if role.valid_to and role.valid_to < Time.now.to_date
322
- # check if role is active in this site
323
- policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
324
- next unless policy_role
325
- # set edit_mode
326
- session[:edit_mode] = 1 if policy_role.permission > 1
327
- session[:user_roles] << role.dc_policy_role_id
328
- end
329
- # Save remember me cookie if not CMS user and remember me is selected
330
- if session[:edit_mode] == 0 and remember_me
331
- cookies.signed[:remember_me] = { :value => user.id, :expires => 180.days.from_now}
332
- end
333
- end
334
-
335
347
  end