drg_cms 0.6.1.0 → 0.6.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
  4. data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
  5. data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
  6. data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
  7. data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
  8. data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
  9. data/app/assets/javascripts/drg_cms/drg_cms.js +178 -55
  10. data/app/assets/stylesheets/drg_cms/drg_cms.css +218 -94
  11. data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
  12. data/app/controllers/cmsedit_controller.rb +29 -24
  13. data/app/controllers/dc_application_controller.rb +78 -166
  14. data/app/controllers/dc_common_controller.rb +56 -47
  15. data/app/controls/dc_help_control.rb +12 -0
  16. data/app/controls/dc_report.rb +7 -9
  17. data/app/controls/design_element_settings_control.rb +1 -1
  18. data/app/forms/all_options.yml +25 -6
  19. data/app/forms/dc_big_table.yml +0 -2
  20. data/app/forms/dc_big_table_value.yml +0 -2
  21. data/app/forms/dc_design.yml +1 -2
  22. data/app/forms/dc_folder_permission.yml +0 -2
  23. data/app/forms/dc_help_1.yml +2 -1
  24. data/app/forms/dc_json_ld.yml +0 -3
  25. data/app/forms/dc_menu.yml +6 -12
  26. data/app/forms/dc_menu_item.yml +1 -3
  27. data/app/forms/dc_page.yml +5 -2
  28. data/app/forms/dc_policy.yml +2 -5
  29. data/app/forms/dc_poll.yml +10 -16
  30. data/app/forms/dc_seo.yml +1 -2
  31. data/app/forms/dc_simple_menu.yml +1 -2
  32. data/app/forms/dc_site.yml +5 -7
  33. data/app/helpers/cms_common_helper.rb +2 -3
  34. data/app/helpers/cms_edit_helper.rb +41 -31
  35. data/app/helpers/cms_helper.rb +6 -6
  36. data/app/helpers/cms_index_helper.rb +79 -34
  37. data/app/helpers/dc_application_helper.rb +99 -85
  38. data/app/models/concerns/dc_page_concern.rb +3 -2
  39. data/app/models/concerns/dc_piece_concern.rb +1 -1
  40. data/app/models/concerns/dc_site_concern.rb +10 -4
  41. data/app/models/concerns/dc_user_concern.rb +3 -3
  42. data/app/models/dc_big_table.rb +2 -2
  43. data/app/models/dc_filter.rb +28 -22
  44. data/app/models/dc_site.rb +0 -1
  45. data/app/models/dc_temp.rb +7 -0
  46. data/app/models/drgcms_form_fields/comment.rb +11 -2
  47. data/app/models/drgcms_form_fields/date_picker.rb +2 -0
  48. data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
  49. data/app/models/drgcms_form_fields/embedded.rb +4 -2
  50. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  51. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  52. data/app/models/drgcms_form_fields/select.rb +16 -18
  53. data/app/models/drgcms_form_fields/text_autocomplete.rb +39 -23
  54. data/app/renderers/dc_page_renderer.rb +7 -6
  55. data/app/renderers/dc_poll_renderer.rb +16 -20
  56. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  57. data/app/views/cmsedit/_form.html.erb +3 -2
  58. data/app/views/cmsedit/_result.html.erb +21 -18
  59. data/app/views/cmsedit/edit.html.erb +2 -1
  60. data/app/views/cmsedit/index.html.erb +1 -1
  61. data/app/views/cmsedit/new.html.erb +3 -2
  62. data/app/views/dc_common/_help.html.erb +12 -3
  63. data/app/views/layouts/cms.html.erb +3 -5
  64. data/config/locales/drgcms_en.yml +5 -2
  65. data/config/locales/drgcms_sl.yml +5 -2
  66. data/config/locales/models_en.yml +2 -0
  67. data/config/locales/models_sl.yml +5 -3
  68. data/drg_cms.gemspec +16 -16
  69. data/lib/drg_cms/version.rb +1 -1
  70. data/lib/drg_cms.rb +46 -12
  71. metadata +35 -29
@@ -41,9 +41,10 @@
41
41
  # its control's would be found in model_embedded_controls.rb. By convention module names
42
42
  # are declared in camel case, so our dc_page_controls.rb declares DrgcmsControls::DcPageControls module.
43
43
  #
44
- # Controls (among other) may contain 6 fixed callback methods.
44
+ # Controls (among other) may contain 7 callback methods.
45
45
  # These methods are:
46
46
  # * dc_new_record
47
+ # * dc_dup_record
47
48
  # * dc_before_edit
48
49
  # * dc_before_save
49
50
  # * dc_after_save
@@ -67,7 +68,7 @@
67
68
  # if dc_user_can(DcPermission::CAN_READ)
68
69
  # dc_page.where(created_by: session[:user_id])
69
70
  # else
70
- # flash[:error] = 'You can not perform this operation!'
71
+ # flash[:error] = 'User can not perform this operation!'
71
72
  # nil
72
73
  # end
73
74
  # end
@@ -76,7 +77,6 @@
76
77
  ########################################################################
77
78
  class CmseditController < DcApplicationController
78
79
  before_action :check_authorization, :except => [:login, :logout, :test, :run]
79
- before_action :dc_reload_patches if Rails.env.development?
80
80
  protect_from_forgery with: :null_session, only: Proc.new { |c| c.request.format.json? }
81
81
 
82
82
  layout 'cms'
@@ -234,6 +234,7 @@ end
234
234
  # duplicating document and is subroutine of create action.
235
235
  ########################################################################
236
236
  def duplicate_document(source)
237
+ params['dup_fields'] += ',' if params['dup_fields'] # for easier field matching
237
238
  dest = {}
238
239
  source.attribute_names.each do |attribute_name|
239
240
  next if attribute_name == '_id' # don't duplicate _id
@@ -294,12 +295,11 @@ def create
294
295
  end
295
296
  else # duplicate record
296
297
  find_record
297
- params['dup_fields'] += ',' if params['dup_fields'] # for easier field matching
298
298
  new_doc = duplicate_document(@record)
299
299
  create_new_empty_record(new_doc)
300
- update_standards()
300
+ if (m = callback_method('dup_record')) then call_callback_method(m) end
301
+ update_standards
301
302
  @record.save!
302
-
303
303
  index
304
304
  end
305
305
  end
@@ -331,10 +331,8 @@ def update
331
331
  end
332
332
  end
333
333
 
334
- if dc_user_can(DcPermission::CAN_EDIT_ALL) or
335
- ( @record.respond_to?('created_by') and
336
- @record.created_by == session[:user_id] and
337
- dc_user_can(DcPermission::CAN_EDIT) )
334
+ if dc_user_can(DcPermission::CAN_EDIT_ALL) ||
335
+ (@record.respond_to?('created_by') && @record.created_by == session[:user_id] && dc_user_can(DcPermission::CAN_EDIT))
338
336
 
339
337
  if save_data
340
338
  params[:return_to] = 'index' if params[:commit] == t('drgcms.save&back') # save & back
@@ -688,7 +686,7 @@ def create_new_empty_record(initial_data = nil) #:nodoc:
688
686
  @record = @tables.first[0].new(initial_data)
689
687
  else
690
688
  rec = @tables.first[0].find(@ids.first) # top most record
691
- 1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded childrens by ids
689
+ 1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded children by ids
692
690
  @record = rec.send(@tables.last[1].pluralize).new(initial_data) # new record
693
691
  end
694
692
  end
@@ -715,8 +713,9 @@ end
715
713
  ########################################################################
716
714
  def save_journal(operation, changes = {})
717
715
  if operation == :delete
718
- @record.attributes.each {|k,v| changes[k] = v}
716
+ @record.attributes.each { |k, v| changes[k] = v }
719
717
  end
718
+ changes.except!('created_at', 'updated_at', 'created_by', 'updated_by')
720
719
 
721
720
  if (operation != :update) || changes.size > 0
722
721
  # determine site_id
@@ -740,7 +739,7 @@ end
740
739
  # Returns callback method name or nil if not defined.
741
740
  ########################################################################
742
741
  def callback_method(key) #:nodoc:
743
- data_key = key.gsub('_','-') # convert _ to -
742
+ data_key = key.gsub('_', '-') # convert _ to -
744
743
  callback = case
745
744
  when params['data'] && params['data'][data_key] then params['data'][data_key]
746
745
  # dc_ + key method is present then call it automatically
@@ -784,9 +783,10 @@ end
784
783
  def process_return_to(return_to)
785
784
  script = case
786
785
  when return_to == 'index' then return index
786
+ when return_to.match(/eval=/i) then return_to.sub('eval=', '')
787
787
  when return_to.match(/parent\.reload/i) then 'parent.location.href=parent.location.href;'
788
788
  when return_to.match(/reload/i) then 'location.href=location.href;'
789
- when return_to.match(/close/i) then 'window.close();'
789
+ when return_to.match(/window.close/i) then 'window.close();'
790
790
  when return_to.match(/none/i) then return
791
791
  else "location.href='#{return_to}'"
792
792
  end
@@ -830,6 +830,7 @@ def save_data
830
830
  value = DrgcmsFormFields.const_get(v['type'].camelize).get_data(params, v['name'])
831
831
  @record.send("#{v['name']}=", value)
832
832
  end
833
+
833
834
  # before_save callback
834
835
  if (m = callback_method('before_save') )
835
836
  ret = call_callback_method(m)
@@ -842,7 +843,7 @@ def save_data
842
843
  update_standards() if changes.size > 0 # update only if there has been some changes
843
844
  if (saved = @record.save)
844
845
  operation = @record.new_record? ? :new : :update
845
- save_journal(operation, changes)
846
+ save_journal(operation, @record.previous_changes)
846
847
  # after_save callback
847
848
  if (m = callback_method('after_save') ) then call_callback_method(m) end
848
849
  end
@@ -1006,30 +1007,34 @@ end
1006
1007
  # Process index action for normal collections.
1007
1008
  ########################################################################
1008
1009
  def process_collections #:nodoc
1009
- # If result_set is not defined on form, then it will fail. :return_to should know where to go
1010
+ # If result_set is not defined on form, then it will fail. :return_to should know where to go
1010
1011
  if @form['result_set'].nil?
1011
- process_return_to(params[:return_to] || 'reload')
1012
+ process_return_to(params[:return_to] || 'reload')
1012
1013
  return true
1013
1014
  end
1014
- # for now enable only filtering of top level documents
1015
+ # when result set is evaluated as Rails helper
1016
+ @form['result_set']['type'] ||= 'default'
1017
+ return unless @form['result_set']['type'] == 'default'
1018
+
1019
+ # for now enable only filtering of top level documents
1015
1020
  if @tables.size == 1
1016
1021
  check_filter_options()
1017
1022
  check_sort_options()
1018
1023
  end
1019
- # result set is defined by filter method in control object
1024
+ # result set is defined by filter method in control object
1020
1025
  form_filter = @form['result_set']['filter']
1021
1026
  if form_filter
1022
1027
  if respond_to?(form_filter)
1023
1028
  @records = send(form_filter)
1024
- # something went wrong. flash[] should have explanation.
1029
+ # something went wrong. flash[] should have explanation.
1025
1030
  if @records.class == FalseClass
1026
1031
  @records = []
1027
1032
  render(action: :index)
1028
1033
  return true
1029
1034
  end
1030
1035
  process_select_and_deny_fields
1031
- # pagination but only if not already set
1032
- unless (@form['table'] == 'dc_memory' or @records.options[:limit])
1036
+ # pagination but only if not already set
1037
+ unless (@form['table'] == 'dc_memory' || @records.options[:limit])
1033
1038
  per_page = (@form['result_set']['per_page'] || 30).to_i
1034
1039
  @records = @records.page(params[:page]).per(per_page) if per_page > 0
1035
1040
  end
@@ -1040,10 +1045,10 @@ def process_collections #:nodoc
1040
1045
  if @tables.size > 1
1041
1046
  rec = @tables.first[0].find(@ids.first) # top most document.id
1042
1047
  1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded childrens by ids
1043
- # TO DO. When field name is different then pluralized class name. Not working yet.
1048
+ # TO DO. When field name is different then pluralized class name. Not working yet.
1044
1049
  embedded_field_name = @tables.last[0] ? @tables.last[1].pluralize : @tables.last[1]
1045
1050
  @records = rec.send(embedded_field_name) # current embedded set
1046
- # sort by order if order field is present in model
1051
+ # sort by order if order field is present in model
1047
1052
  if @tables.last[1].classify.constantize.respond_to?(:order)
1048
1053
  @records = @records.order_by('order asc')
1049
1054
  end
@@ -26,10 +26,10 @@
26
26
  # application controllers.
27
27
  ##########################################################################
28
28
  class DcApplicationController < ActionController::Base
29
- protect_from_forgery
30
-
31
- before_action :dc_reload_patches if Rails.env.development?
32
-
29
+ protect_from_forgery with: :null_session, only: Proc.new { |c| c.request.format.json? }
30
+ before_action :dc_reload_patches if Rails.env.development?
31
+ before_action :dc_set_locale
32
+
33
33
  ########################################################################
34
34
  # Writes anything passed as parameter to logger file.
35
35
  # Very useful for debuging strange errors.
@@ -54,9 +54,9 @@ end
54
54
  ####################################################################
55
55
  # Checks if user has required role.
56
56
  #
57
- # @param [DcPolicyRole] role can be passed as DcPolicyRole object or
58
- # @param [String] role as role name. If passed as name, dc_policy_roles is searched for appropriate role.
59
- #
57
+ # @param [DcPolicyRole or String] role can be passed as DcPolicyRole object or
58
+ # as role name. If passed as name, dc_policy_roles is searched for appropriate role.
59
+ #
60
60
  # @return [Boolean] True if user has required role added to his profile.
61
61
  #
62
62
  # @example If user has required role
@@ -153,7 +153,7 @@ end
153
153
  # Will write document to dc_visits collection unless visit comes from robot.
154
154
  # It also sets session[is_robot] variable to true if robot.
155
155
  ########################################################################
156
- def dc_log_visit()
156
+ def dc_log_visit
157
157
  if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
158
158
  logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
159
159
  session[:is_robot] = true
@@ -173,8 +173,8 @@ protected
173
173
  # Checks if user can perform (read, create, edit, delete) document in specified
174
174
  # table (collection).
175
175
  #
176
- # @param [Integer] Required permission level
177
- # @param [String] Collection (table) name for which permission is queried. Defaults to params[table].
176
+ # @param [Integer] permission: Required permission level
177
+ # @param [String] table: Collection (table) name for which permission is queried. Defaults to params[table].
178
178
  #
179
179
  # @return [Boolean] true if user's role permits (is higher or equal then required) operation on a table (collection).
180
180
  #
@@ -182,19 +182,14 @@ protected
182
182
  # if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
183
183
  ############################################################################
184
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])
185
+ table = table.underscore
191
186
  cache_key = ['dc_permission', table, session[:user_id], dc_get_site.id]
192
187
  permissions = dc_cache_read(cache_key)
193
188
  if permissions.nil?
194
189
  permissions = DcPermission.permissions_for_table(table)
195
190
  dc_cache_write(cache_key, permissions)
196
191
  end
197
- session[:user_roles].each {|r| return true if permissions[r] && permissions[r] >= permission }
192
+ session[:user_roles].each { |r| return true if permissions[r] && permissions[r] >= permission }
198
193
  false
199
194
  end
200
195
 
@@ -216,33 +211,22 @@ def dc_cache_read(keys)
216
211
  end
217
212
  end
218
213
 
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
214
  ####################################################################
225
215
  # Write data to cache
226
216
  #
227
- # @param [Array] Array of keys
228
- # @param [Object] Data written to cache
217
+ # @param [Array] keys: Array of keys
218
+ # @param [Object] data: Data written to cache
229
219
  #
230
220
  # @return [Object] data so dc_cache_write can be used as last statement in method.
231
221
  ####################################################################
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
222
+ def dc_cache_write(keys, data)
223
+ if redis_cache_store?
224
+ keys = keys.dup
225
+ first = keys.shift
226
+ redis.hset(first, keys.join(''), Marshal.dump(data))
227
+ else
228
+ Rails.cache.write(keys.join(''), data)
241
229
  end
242
-
243
- def __dc_cache_write(keys, data)
244
- p 'write', keys.join('')
245
- pp Rails.cache.write(keys.join(''), data)
246
230
  data
247
231
  end
248
232
 
@@ -256,8 +240,8 @@ def dc_set_is_mobile
256
240
  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])
257
241
  : false
258
242
  session[:is_mobile] = is_mobile ? 1 : 0
259
- #
260
- if request.env["HTTP_USER_AGENT "] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
243
+
244
+ if request.env["HTTP_USER_AGENT "] && request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
261
245
  logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
262
246
  session[:is_robot] = true
263
247
  end
@@ -266,24 +250,14 @@ end
266
250
  ##########################################################################
267
251
  # Merge values from parameters fields (from site, page ...) into internal @options hash.
268
252
  #
269
- # @param [String] YAML string.
253
+ # @param [String] parameters: passed as YAML string.
270
254
  ##########################################################################
271
255
  def dc_set_options(parameters)
272
256
  @options ||= {}
273
257
  return if parameters.to_s.size < 3
274
- # parameters are set az YAML. This should be default in future.
275
- parms = YAML.load(parameters) rescue nil
276
- if parms.nil? # error when loadnig yaml, try the old way parsing manually
277
- parms = {}
278
- parameters.split("\n").each do |line|
279
- line.chomp.split(',').each do |parm|
280
- key, value = parm.split(':')
281
- value = value.to_s.strip.gsub(/\'|\"/,'')
282
- parms[key.strip] = (value == '/' ? nil : value)
283
- end
284
- end
285
- end
286
- @options.merge!(parms)
258
+ # parameters are set as YAML. This should be default in future.
259
+ parms = YAML.load(parameters) rescue {}
260
+ @options = @options.deep_merge(parms)
287
261
  end
288
262
 
289
263
  ##########################################################################
@@ -296,7 +270,6 @@ end
296
270
  # @return [Boolean] true when none of documents is changed.
297
271
  ##########################################################################
298
272
  def dc_not_modified?(*documents)
299
- # request.env.each {|k,v| p k,'*',v}
300
273
  return false unless request.env.include? 'HTTP_IF_MODIFIED_SINCE'
301
274
 
302
275
  since_date = Time.parse request.env['HTTP_IF_MODIFIED_SINCE']
@@ -305,7 +278,7 @@ def dc_not_modified?(*documents)
305
278
  next unless doc.respond_to?(:updated_at)
306
279
  last_modified = doc.updated_at if doc.updated_at > last_modified
307
280
  end
308
- # p last_modified, since_date
281
+
309
282
  if last_modified >= since_date then
310
283
  render :nothing => true, :status => 304
311
284
  return true
@@ -324,13 +297,13 @@ def get_design_and_render(design_doc)
324
297
  layout = @site.site_layout.blank? ? 'content' : @site.site_layout
325
298
  site_top = '<%= dc_page_top %>'
326
299
  site_bottom = '<%= dc_page_bottom %>'
327
- # lets try the rails way
300
+ # lets try the rails way
328
301
  if @options[:control] && @options[:action]
329
302
  controller = "#{@options[:control]}_control".classify.constantize rescue nil
330
303
  extend controller if controller
331
304
  return send @options[:action] if respond_to?(@options[:action])
332
305
  end
333
- # design doc present
306
+ # design doc present
334
307
  if design_doc
335
308
  # defined as rails view
336
309
  design = if design_doc.rails_view.blank? || design_doc.rails_view == 'site'
@@ -344,7 +317,7 @@ def get_design_and_render(design_doc)
344
317
  design = site_top + design + site_bottom
345
318
  return render(inline: design, layout: layout) unless design.blank?
346
319
  end
347
- # Design doc not defined
320
+ # Design doc not defined
348
321
  if @site.rails_view.blank?
349
322
  design = site_top + @site.design + site_bottom
350
323
  render(inline: design, layout: layout)
@@ -384,6 +357,7 @@ def dc_process_default_request
384
357
  params[:path] = @options[:path].first if @options[:path].size > 1
385
358
  # some other process request. It should fail if not defined
386
359
  return send(@site.request_processor) unless @site.request_processor.blank?
360
+
387
361
  # Search for page
388
362
  pageclass = @site.page_klass
389
363
  if params[:id]
@@ -405,6 +379,7 @@ def dc_process_default_request
405
379
  end
406
380
  # if @page is not found render 404 error
407
381
  return dc_render_404('Page!') unless @page
382
+
408
383
  dc_set_is_mobile unless session[:is_mobile] # do it only once per session
409
384
  # find design if defined. Otherwise design MUST be declared in site
410
385
  if @page.dc_design_id
@@ -427,8 +402,7 @@ def dc_process_default_request
427
402
  get_design_and_render @design
428
403
  end
429
404
 
430
- ######
431
- # ####################################################################
405
+ ###########################################################################
432
406
  # Single site document kind of request handler.
433
407
  #
434
408
  # This request handler assumes that all data for the site is saved in the site document.
@@ -444,18 +418,17 @@ def dc_single_sitedoc_request
444
418
  if @site.nil?
445
419
  session[:edit_mode] ||= 0
446
420
  @site = dc_get_site
447
- # @site is not defined. render 404 error
421
+ # @site is not defined. render 404 error
448
422
  return dc_render_404('Site!') unless @site
423
+
449
424
  dc_set_options(@site.settings)
450
425
  end
451
- # HOMEPAGE. When no parameters is set
426
+ # HOMEPAGE. When no parameters is set
452
427
  params[:path] = @site.homepage_link if params[:path].nil?
453
428
  @parts = @site.dc_parts
454
429
  @part = @parts.find_by(link: params[:path])
455
430
  return dc_render_404('Part!') unless @part
456
- # Document was not modified since last visit
457
- # return if dc_not_modified?(@site, @part)
458
- #
431
+
459
432
  @page_title = "#{@site.page_title} #{@part.name}"
460
433
  @js, @css = '', ''
461
434
  get_design_and_render nil
@@ -466,46 +439,36 @@ end
466
439
  # very good with non ascii chars. Since this method is used for converting from model
467
440
  # to collection names it is very unwise to use non ascii chars for table (collection) names.
468
441
  #
469
- # @param [String] String to be converted
470
- #
442
+ # @param [Object] model_string to be converted
443
+ #
471
444
  # @example
472
445
  # decamelize_type(ModelName) # 'ModelName' => 'model_name'
473
446
  ########################################################################
474
- def decamelize_type(string)
475
- return nil unless string
476
- r = ''
477
- string.to_s.each_char do |c|
478
- r << case
479
- when r.size == 0 then c.downcase
480
- when c.downcase != c then '_' + c.downcase
481
- else c
482
- end
483
- end
484
- r
447
+ def decamelize_type(model_string)
448
+ model_string ? model_string.underscore : nil
485
449
  end
486
450
 
487
451
  ####################################################################
488
452
  # Return's error messages for the document formated for display on edit form.
489
453
  #
490
- # @param [Document] Document object which will be examined for errors.
491
- #
454
+ # @param [Document] document object which will be examined for errors.
455
+ #
492
456
  # @return [String] HTML code for displaying error on edit form.
493
457
  ####################################################################
494
458
  def dc_error_messages_for(document)
495
459
  return '' unless document.errors.any?
460
+
496
461
  msg = ''
497
- document.errors.each do |attribute, errors_array|
498
- label = t("helpers.label.#{decamelize_type(document.class)}.#{attribute}")
499
- msg << "<li>#{label} : #{errors_array}</li>"
462
+ document.errors.each do |error|
463
+ label = t("helpers.label.#{decamelize_type(document.class)}.#{error.attribute}", error.attribute)
464
+ msg << "<li>#{label} : #{error.message}</li>"
500
465
  end
501
466
 
502
- html = <<eot
467
+ %(
503
468
  <div class="dc-form-error">
504
469
  <h2>#{t('drgcms.errors_no')} #{document.errors.size}</h2>
505
470
  <ul>#{msg}</ul>
506
- </div>
507
- eot
508
- html.html_safe
471
+ </div>).html_safe
509
472
  end
510
473
 
511
474
  ####################################################################
@@ -514,8 +477,8 @@ end
514
477
  # model errors or when saving to multiple collections and where each save must be
515
478
  # checked if succesfull.
516
479
  #
517
- # @param [Document] Document object which will be checked
518
- # @param [Boolean] If true method should end in runtime error. Default = false.
480
+ # @param [Document] document: Document object to be checked
481
+ # @param [Boolean] crash: If true method should end in runtime error. Default = false.
519
482
  #
520
483
  # @return [String] Error messages or empty string if everything is OK.
521
484
  #
@@ -527,16 +490,16 @@ end
527
490
  # end
528
491
  #
529
492
  ####################################################################
530
- def dc_check_model(document, crash=false)
531
- DrgCms.check_model(document, crash=false)
493
+ def dc_check_model(document, crash = false)
494
+ DrgCms.model_check(document, crash)
532
495
  end
533
496
 
534
497
  ######################################################################
535
498
  # Call rake task from controller.
536
499
  #
537
- # @param [String] Rake task name
538
- # @param [Hash] Options that will be send to task as environment variables
539
- #
500
+ # @param [String] task: Rake task name
501
+ # @param [Hash] options: Options that will be send to task as environment variables
502
+ #
540
503
  # @example Call rake task from application
541
504
  # dc_call_rake('clear:all', some_parm: some_id)
542
505
  ######################################################################
@@ -551,7 +514,7 @@ end
551
514
  # made from DRG CMS form return may be quite complicated. All ajax return combinations
552
515
  # can be found in drg_cms.js file.
553
516
  #
554
- # @param [Hash] Options
517
+ # @param [Hash] opts: Options
555
518
  #
556
519
  # @return [JSON Response] Formatted to be used for ajax return.
557
520
  #
@@ -616,6 +579,20 @@ def dc_reload_patches
616
579
  end
617
580
  end
618
581
 
582
+ ########################################################################
583
+ # Will set new default locale for application
584
+ #
585
+ # @param [String] new_locale : New locale value. If omitted it will be provided from params[:locale].
586
+ # if new_locale value is 00, application's default_locale will be used.
587
+ ########################################################################
588
+ def dc_set_locale(new_locale = nil)
589
+ new_locale ||= params[:locale]
590
+ if new_locale && new_locale != session[:locale]
591
+ session[:locale] = new_locale == '00' ? nil : new_locale.to_sym
592
+ end
593
+ I18n.locale = session[:locale] ? session[:locale] : I18n.default_locale
594
+ end
595
+
619
596
  ############################################################################
620
597
  # Writes out deprication msg. It also adds site_name to message, so it is easier to
621
598
  # find where the message is comming from.
@@ -643,51 +620,6 @@ def set_default_guest_user_role
643
620
  session[:user_roles] = [guest.id] if guest
644
621
  end
645
622
 
646
- ####################################################################
647
- # Fills session with data related to successful login.
648
- #
649
- # @param [DcUser] user : User's document
650
- # @param [Boolean] remember_me : false by default
651
- ####################################################################
652
- def fill_login_data(user, remember_me=false)
653
- session[:user_id] = user.id if user
654
- session[:user_name] = user.name if user
655
- session[:edit_mode] = 0
656
- session[:user_roles] = []
657
- # Every user has guest role
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
662
- # special for SUPERADMIN
663
- sa = DcPolicyRole.find_by(system_name: 'superadmin')
664
- if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
665
- session[:user_roles] << role.dc_policy_role_id
666
- session[:edit_mode] = 2
667
- return
668
- end
669
- # read default policy from site. Policy might be inherited
670
- policy_site = dc_get_site()
671
- policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
672
- default_policy = policy_site.dc_policies.find_by(is_default: true)
673
- # load user roles
674
- user.dc_user_roles.each do |role|
675
- next unless role.active
676
- next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
677
- next if role.valid_to and role.valid_to < Time.now.to_date
678
- # check if role is active in this site
679
- policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
680
- next unless policy_role
681
- # set edit_mode
682
- session[:edit_mode] = 1 if policy_role.permission > 1
683
- session[:user_roles] << role.dc_policy_role_id
684
- end
685
- # Save remember me cookie if not CMS user and remember me is selected
686
- if session[:edit_mode] == 0 and remember_me
687
- cookies.signed[:remember_me] = { :value => user.id, :expires => 180.days.from_now}
688
- end
689
- end
690
-
691
623
  ####################################################################
692
624
  # Fills session with data related to successful login.
693
625
  #
@@ -696,7 +628,7 @@ end
696
628
  ####################################################################
697
629
  def fill_login_data(user, remember_me = false)
698
630
  session[:user_id] = user.id if user
699
- session[:user_name] = user.name if user
631
+ session[:user_name] = user.name.squish if user
700
632
  session[:edit_mode] = 0
701
633
  set_default_guest_user_role
702
634
  return unless user&.active
@@ -771,7 +703,7 @@ end
771
703
  # Evaluates Class.method in more predictable context then just calling eval
772
704
  #
773
705
  # @param [String] class_method defined as MyClass.method_name
774
- # @param [Object] optional parameters send to class_method
706
+ # @param [Object] params: optional parameters send to class_method
775
707
  ##########################################################################
776
708
  def dc_eval_class_method(class_method, params = nil)
777
709
  klass, method = class_method.split('.')
@@ -823,28 +755,9 @@ def dc_add_meta_tag(type, name, content)
823
755
  end
824
756
 
825
757
  ########################################################################
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
758
+ # Will prepare flash[:update] data, which is used for updating elements
844
759
  # on parent form.
845
760
  #
846
- # dc_update_form_field will be deprecated eventually.
847
- #
848
761
  # Parameters passed as hash:
849
762
  # [field] String: Field name
850
763
  # [head] String: Filed name in head of form
@@ -858,11 +771,10 @@ def dc_update_form_element(field: nil, head: nil, value:, readonly: true)
858
771
  elsif head
859
772
  "head-#{head}"
860
773
  end
774
+ return if key.nil?
861
775
 
862
- if key
863
- flash[:update] ||= {}
864
- flash[:update][key] = value
865
- end
776
+ flash[:update] ||= {}
777
+ flash[:update][key] = value
866
778
  end
867
779
 
868
780
  ####################################################################