drg_cms 0.6.0.8 → 0.6.1.5

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/javascripts/drg_cms/drg_cms.js +208 -81
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +298 -93
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
  6. data/app/controllers/cmsedit_controller.rb +174 -167
  7. data/app/controllers/dc_application_controller.rb +230 -196
  8. data/app/controllers/dc_common_controller.rb +88 -50
  9. data/app/controls/dc_help_control.rb +138 -0
  10. data/app/controls/dc_report.rb +12 -16
  11. data/app/forms/all_options.yml +14 -5
  12. data/app/forms/cms_menu.yml +7 -1
  13. data/app/forms/dc_big_table.yml +0 -2
  14. data/app/forms/dc_big_table_value.yml +0 -2
  15. data/app/forms/dc_category.yml +2 -1
  16. data/app/forms/dc_design.yml +2 -2
  17. data/app/forms/dc_folder_permission.yml +0 -2
  18. data/app/forms/dc_help_1.yml +110 -0
  19. data/app/forms/dc_journal.yml +3 -1
  20. data/app/forms/dc_json_ld.yml +0 -3
  21. data/app/forms/dc_link.yml +1 -1
  22. data/app/forms/dc_menu.yml +8 -12
  23. data/app/forms/dc_menu_item.yml +2 -3
  24. data/app/forms/dc_page.yml +7 -2
  25. data/app/forms/dc_part.yml +1 -0
  26. data/app/forms/dc_piece.yml +1 -0
  27. data/app/forms/dc_policy.yml +2 -5
  28. data/app/forms/dc_poll.yml +13 -16
  29. data/app/forms/dc_seo.yml +1 -2
  30. data/app/forms/dc_simple_menu.yml +3 -2
  31. data/app/forms/dc_site.yml +5 -8
  32. data/app/forms/dc_user.yml +27 -11
  33. data/app/forms/dc_user_role.yml +3 -0
  34. data/app/helpers/cms_common_helper.rb +68 -4
  35. data/app/helpers/cms_edit_helper.rb +73 -55
  36. data/app/helpers/cms_helper.rb +70 -32
  37. data/app/helpers/cms_index_helper.rb +155 -102
  38. data/app/helpers/dc_application_helper.rb +132 -109
  39. data/app/models/concerns/dc_page_concern.rb +14 -4
  40. data/app/models/concerns/dc_piece_concern.rb +1 -1
  41. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  42. data/app/models/concerns/dc_site_concern.rb +56 -44
  43. data/app/models/concerns/dc_user_concern.rb +58 -19
  44. data/app/models/dc_big_table.rb +2 -2
  45. data/app/models/dc_design.rb +29 -19
  46. data/app/models/dc_filter.rb +28 -22
  47. data/app/models/dc_key_value_store.rb +1 -0
  48. data/app/models/dc_permission.rb +19 -9
  49. data/app/models/dc_policy.rb +25 -14
  50. data/app/models/dc_policy_role.rb +22 -11
  51. data/app/models/dc_temp.rb +8 -1
  52. data/app/models/dc_user_role.rb +2 -2
  53. data/app/models/drgcms_form_fields/comment.rb +11 -2
  54. data/app/models/drgcms_form_fields/date_picker.rb +2 -0
  55. data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
  56. data/app/models/drgcms_form_fields/embedded.rb +9 -10
  57. data/app/models/drgcms_form_fields/file_field.rb +1 -1
  58. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  59. data/app/models/drgcms_form_fields/hash_field.rb +11 -7
  60. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  61. data/app/models/drgcms_form_fields/method.rb +5 -4
  62. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +1 -1
  63. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  64. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  65. data/app/models/drgcms_form_fields/select.rb +24 -25
  66. data/app/models/drgcms_form_fields/text_autocomplete.rb +22 -14
  67. data/app/renderers/dc_page_renderer.rb +7 -6
  68. data/app/renderers/dc_poll_renderer.rb +16 -20
  69. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  70. data/app/views/cmsedit/_form.html.erb +3 -2
  71. data/app/views/cmsedit/_result.html.erb +21 -18
  72. data/app/views/cmsedit/edit.html.erb +4 -1
  73. data/app/views/cmsedit/index.html.erb +3 -2
  74. data/app/views/cmsedit/new.html.erb +5 -2
  75. data/app/views/dc_common/_help.html.erb +17 -0
  76. data/app/views/layouts/models.html.erb +2 -1
  77. data/config/locales/drgcms_en.yml +17 -2
  78. data/config/locales/drgcms_sl.yml +20 -2
  79. data/config/locales/models_en.yml +7 -5
  80. data/config/locales/models_sl.yml +12 -9
  81. data/drg_cms.gemspec +16 -16
  82. data/lib/drg_cms/version.rb +1 -1
  83. data/lib/drg_cms.rb +94 -2
  84. metadata +32 -30
  85. data/app/models/__dc_dummy.rb +0 -102
@@ -1,4 +1,3 @@
1
- #coding: utf-8
2
1
  #--
3
2
  # Copyright (c) 2012+ Damjan Rems
4
3
  #
@@ -95,17 +94,17 @@ end
95
94
  ############################################################################
96
95
  def dc_render(renderer, opts={})
97
96
  return dc_render_design_part(renderer[:part]) if renderer.class == Hash
98
- #
97
+
99
98
  opts[:edit_mode] = session[:edit_mode]
100
99
  opts[:editparams] = {}
101
100
 
102
101
  opts = @options.merge(opts) # merge options with parameters passed on site, page, design ...
103
102
  opts.symbolize_keys! # this makes lots of things easier
104
- # Create renderer object
103
+ # Create renderer object
105
104
  klass = renderer.to_s.downcase
106
105
  klass += '_renderer' unless klass.match('_renderer') #
107
106
  obj = Kernel.const_get(klass.classify, Class.new).new(self, opts) rescue nil
108
- #
107
+
109
108
  if obj
110
109
  html = obj.render_html
111
110
  @css << obj.render_css.to_s
@@ -133,7 +132,7 @@ def dc_replace_in_design(opts={})
133
132
  design = opts[:piece] ? DcPiece.find(name: opts[:piece]).script : dc_get_site.design
134
133
  layout = opts[:layout] || (dc_get_site.site_layout.size > 2 ? dc_get_site.site_layout : nil)
135
134
  if opts[:replace]
136
- # replace more than one part of code
135
+ # replace more than one part of code
137
136
  if opts[:replace].class == Array
138
137
  0.upto(opts[:replace].size - 1) {|i| design.sub!(opts[:replace][i], opts[:with][i])}
139
138
  else
@@ -179,13 +178,12 @@ end
179
178
  #
180
179
  # This helper is replacement dc_render_from_site method which will soon be deprecated.
181
180
  ########################################################################
182
- def dc_render_design_part(part)
183
-
181
+ def dc_render_design_part(part)
184
182
  case
185
183
  when part.nil? then logger.error('ERROR dc_render_design_part! part is NIL !'); ''
186
- # Send as array. Part may be defined with options on page. First element has
187
- # name of element which defines what to do. If not defined default behaviour is
188
- # called. That is what is defined in second part of array.
184
+ # Send as array. Part may be defined with options on page. First element has
185
+ # name of element which defines what to do. If not defined default behaviour is
186
+ # called. That is what is defined in second part of array.
189
187
  when part.class == Array then
190
188
  if @options.dig(:settings, part.first)
191
189
  #TODO to be defined
@@ -196,9 +194,9 @@ def dc_render_design_part(part)
196
194
  when part.class == Proc then
197
195
  result = part.call
198
196
  result.class == Array ? result.first : result
199
- # Send as string. Evaluate content of string
197
+ # Send as string. Evaluate content of string
200
198
  when part.class == String then eval part
201
- # For future maybe. Just call objects to_s method.
199
+ # For future maybe. Just call objects to_s method.
202
200
  else
203
201
  part.to_s
204
202
  end.html_safe
@@ -231,9 +229,9 @@ end
231
229
  ########################################################################
232
230
  # Helper for rendering top CMS menu when in editing mode
233
231
  ########################################################################
234
- def dc_page_top()
235
- if @design and !@design.rails_view.blank?
236
- # Evaluate parameters in design body
232
+ def dc_page_top
233
+ if @design && @design.rails_view.present?
234
+ # Evaluate parameters in design body
237
235
  eval(@design.body)
238
236
  end
239
237
  session[:edit_mode] > 0 ? render(partial: 'cmsedit/edit_stuff') : ''
@@ -243,8 +241,8 @@ end
243
241
  # Helper for adding additional css and javascript code added by documents
244
242
  # and renderers during page rendering.
245
243
  ########################################################################
246
- def dc_page_bottom()
247
- %Q[<style type="text/css">#{@css}</style>#{javascript_tag @js}].html_safe
244
+ def dc_page_bottom
245
+ %(<style type="text/css">#{@css}</style>#{javascript_tag @js}).html_safe
248
246
  end
249
247
 
250
248
  ############################################################################
@@ -258,10 +256,16 @@ end
258
256
  # Returns:
259
257
  # String. HTML code for title.
260
258
  ############################################################################
261
- def dc_table_title(text, result_set=nil)
262
- c = %Q[<div class="dc-title">#{text}]
259
+ def dc_table_title(text, result_set = nil)
260
+ c = %(<div class="dc-title">#{text})
261
+ # help button
262
+ type = result_set.nil? ? 'form' : 'index'
263
+ form_name = params[:form_name] || params[:table]
264
+ url = url_for(controller: :dc_common, action: :help, type: type, form_name: form_name)
265
+ c << %(<div class="dc-help dc-link-ajax" data-url=#{url}>#{fa_icon('question-circle')}</div>)
266
+
263
267
  if result_set and result_set.respond_to?(:current_page)
264
- c << %Q[<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>]
268
+ c << %(<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>)
265
269
  end
266
270
  c << '<div style="clear: both;"></div></div>'
267
271
  c.html_safe
@@ -273,21 +277,21 @@ end
273
277
  # Returns:
274
278
  # String. HTML code for title.
275
279
  ############################################################################
276
- def dc_edit_title()
280
+ def dc_edit_title
277
281
  session[:form_processing] = "form:title:"
278
282
  title = @form['form']['title']
279
- # defined as form:title:edit
283
+ # defined as form:title:edit
280
284
  if title and title['edit'] and !@form['readonly']
281
285
  t( title['edit'], title['edit'] )
282
286
  elsif title and title['show'] and @form['readonly']
283
287
  t( title['show'], title['show'] )
284
288
  else
285
- # concatenate title
289
+ # concatenate title
286
290
  c = (@form['readonly'] ? t('drgcms.show') : t('drgcms.edit')) + " : "
287
- c << (@form['title'] ? t( @form['title'], @form['title'] ) : t_tablename(@form['table'])) + ' : '
291
+ c << (@form['title'].class == String ? t( @form['title'], @form['title'] ) : t_tablename(@form['table'])) + ' : '
288
292
  title = (title and title['field']) ? title['field'] : @form['form']['edit_title']
289
293
  dc_deprecate('form:edit_title will be deprecated. Use form:title:field instead.') if @form['form']['edit_title']
290
- #
294
+
291
295
  c << "#{@record[ title ]} : " if title and @record.respond_to?(title)
292
296
  c << @record.id if @record
293
297
  end
@@ -303,15 +307,11 @@ end
303
307
  def dc_new_title()
304
308
  session[:form_processing] = "form:title:"
305
309
  title = @form['form']['title']
306
- # defined as form:title:new
310
+ # defined as form:title:new
307
311
  if title and title['new']
308
312
  t( title['new'], title['new'] )
309
313
  else
310
- if @form['table'] == 'dc_dummy'
311
- dc_deprecate('dc_dummy will be deprecated. Use dc_memory instead.')
312
- @form['table'] = 'dc_memory'
313
- end
314
- # in memory variables
314
+ # in memory structures
315
315
  if @form['table'] == 'dc_memory'
316
316
  t( @form['title'], @form['title'] )
317
317
  else
@@ -360,7 +360,8 @@ end
360
360
  # Returns icon code if icon is specified
361
361
  ############################################################################
362
362
  def dc_icon_for_link(icon)
363
- return nil unless icon
363
+ return nil if icon.nil?
364
+
364
365
  if icon.match(/\./)
365
366
  _origin.image_tag(icon, class: 'dc-link-img dc-animate')
366
367
  elsif icon.match('<i')
@@ -433,22 +434,13 @@ end
433
434
  # Therefore it is very unwise to use non ascii chars for table (collection) names.
434
435
  #
435
436
  # Parameters:
436
- # [string] String. String to be converted into decamelized string.
437
+ # [Object] model_string. String or model to be converted into decamelized string.
437
438
  #
438
439
  # Returns:
439
440
  # String. Decamelized string.
440
441
  ########################################################################
441
- def decamelize_type(string)
442
- return nil if string.nil?
443
- r = ''
444
- string.to_s.each_char do |c|
445
- r << case
446
- when r.size == 0 then c.downcase
447
- when c.downcase != c then '_' + c.downcase
448
- else c
449
- end
450
- end
451
- r
442
+ def decamelize_type(model_string)
443
+ model_string ? model_string.to_s.underscore : nil
452
444
  end
453
445
 
454
446
  ####################################################################
@@ -462,20 +454,49 @@ end
462
454
  # String. HTML code formatted for display.
463
455
  ####################################################################
464
456
  def dc_error_messages_for(doc)
465
- return '' unless doc and doc.errors.any?
466
- msgs = ''
467
- doc.errors.each do |attribute, errors_array|
468
- label = t("helpers.label.#{decamelize_type(doc.class)}.#{attribute}", attribute)
469
- msgs << "<li>#{label} : #{errors_array}</li>"
457
+ return '' unless doc && doc.errors.any?
458
+
459
+ msgs = doc.errors.inject('') do |r, error|
460
+ label = t("helpers.label.#{decamelize_type(doc.class)}.#{error.attribute}", error.attribute)
461
+ r << "<li>#{label} : #{error.message}</li>"
470
462
  end
471
-
472
- c = <<eot
463
+
464
+ html = <<eot
473
465
  <div class="dc-form-error">
474
466
  <h2>#{t('drgcms.errors_no')} #{doc.errors.size}</h2>
475
467
  <ul>#{msgs}</ul>
476
468
  </div>
477
469
  eot
478
- c.html_safe
470
+ html.html_safe
471
+ end
472
+
473
+ ####################################################################
474
+ # Returns warning messages if any set in a model.
475
+ #
476
+ # When warnings array is added to model its content can be written on top of the form.
477
+ #
478
+ # Parameters:
479
+ # [doc] Document. Document record which will be checked for errors.
480
+ #
481
+ # Returns:
482
+ # String. HTML code formatted for display.
483
+ ####################################################################
484
+ def dc_warning_messages_for(doc)
485
+ return ''
486
+ return '' unless doc && doc.respond_to?(:warnings)
487
+
488
+ msgs = doc.warnings.inject('') do |r, error|
489
+ label = t("helpers.label.#{decamelize_type(doc.class)}.#{error.attribute}", error.attribute)
490
+ msgs << "<li>#{label} : #{error.message}</li>"
491
+ end
492
+
493
+ html = <<eot
494
+ <div class="dc-form-warning">
495
+ <h2>#{t('drgcms.warnings_no')} #{doc.warnings.size}</h2>
496
+ <ul>#{msgs}</ul>
497
+ </div>
498
+ eot
499
+ html.html_safe
479
500
  end
480
501
 
481
502
  ####################################################################
@@ -549,14 +570,14 @@ end
549
570
  # Create edit link with edit picture. Subroutine of dc_page_edit_menu.
550
571
  ####################################################################
551
572
  def dc_link_menu_tag(title) #:nodoc:
552
- html = %Q[
573
+ html = %(
553
574
  <dl>
554
575
  <dt><div class='drgcms_popmenu' href="#">
555
576
  #{_origin.fa_icon('file-text-o lg', class: 'dc-inline-link', title: title)}
556
577
  </div></dt>
557
578
  <dd>
558
579
  <ul class=' div-hidden drgcms_popmenu_class'>
559
- ]
580
+ )
560
581
 
561
582
  yield html
562
583
  html << "</ul></dd></dl>"
@@ -590,10 +611,11 @@ end
590
611
  # Returns:
591
612
  # String. HTML code required for manipulation of currently processed document.
592
613
  ########################################################################
593
- def dc_page_edit_menu(opts=@opts)
614
+ def dc_page_edit_menu(opts = @opts)
594
615
  opts[:edit_mode] ||= _origin.session[:edit_mode]
595
616
  return '' if opts[:edit_mode] < 2
596
- # save some data to cookie. This can not go to session.
617
+
618
+ # save some data to cookie. This can not go to session.
597
619
  page = opts[:page] || @page
598
620
  table = _origin.site.page_class.underscore
599
621
  kukis = { "#{table}.dc_design_id" => page.dc_design_id,
@@ -610,11 +632,9 @@ def dc_page_edit_menu(opts=@opts)
610
632
  opts[:editparams].merge!( :id => page.id, :table => _origin.site.page_class.underscore, form_name: opts[:form_name], edit_only: 'body' )
611
633
  html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_content') )
612
634
 
613
- # opts[:editparams][:edit_only] = nil
614
635
  opts[:editparams].merge!( edit_only: nil, 'icon' => 'pencil' )
615
636
  html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_advanced') )
616
637
 
617
- # opts[:editparams][:action] = 'new'
618
638
  opts[:editparams].merge!( action: 'new', 'icon' => 'plus' )
619
639
  html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_new_page') )
620
640
 
@@ -636,8 +656,7 @@ end
636
656
  # type: text_with_select
637
657
  # eval: 'dc_page_class.all_pages_for_site(@parent.dc_get_site)'
638
658
  ########################################################################
639
- def dc_page_class()
640
- # dc_get_site.page_class.classify.constantize
659
+ def dc_page_class
641
660
  dc_get_site.page_klass
642
661
  end
643
662
 
@@ -652,7 +671,7 @@ end
652
671
  # type: tree_view
653
672
  # eval: 'dc_menu_class.all_menus_for_site(@parent.dc_get_site)'
654
673
  ########################################################################
655
- def dc_menu_class()
674
+ def dc_menu_class
656
675
  dc_get_site.menu_class.classify.constantize
657
676
  end
658
677
 
@@ -666,23 +685,20 @@ end
666
685
  # Returns:
667
686
  # DCSite. Site document.
668
687
  ####################################################################
669
- def dc_get_site()
688
+ def dc_get_site
670
689
  return @site if @site # already cached
671
- #
690
+
672
691
  req = _origin.request.url # different when called from renderer
673
692
  uri = URI.parse(req)
674
693
  @site = DcSite.find_by(name: uri.host)
675
- # Site can be aliased
676
- if @site and !@site.alias_for.blank?
677
- @site = DcSite.find_by(name: @site.alias_for)
678
- end
679
- # Development environment. Check if site with name test exists and use
680
- # alias_for field as pointer to real site name.
681
- if @site.nil? and ENV["RAILS_ENV"] != 'production'
694
+ # Site can be aliased
695
+ @site = DcSite.find_by(name: @site.alias_for) if @site&.alias_for.present?
696
+ # Development. If site with name test exists use alias_for field as pointer to real site data
697
+ if @site.nil? && ENV["RAILS_ENV"] != 'production'
682
698
  @site = DcSite.find_by(name: 'test')
683
699
  @site = DcSite.find_by(name: @site.alias_for) if @site
684
700
  end
685
- @site = nil if @site and !@site.active # site is disabled
701
+ @site = nil if @site && !@site.active # site is disabled
686
702
  @site
687
703
  end
688
704
 
@@ -698,9 +714,9 @@ end
698
714
  # html:
699
715
  # include_blank: true
700
716
  ############################################################################
701
- def dc_choices4_site_policies()
717
+ def dc_choices4_site_policies
702
718
  site = dc_get_site()
703
- site.dc_policies.all.inject([]) { |r, policy| r << [ policy.name, policy.id] if policy.active }
719
+ site.dc_policies.where(active: true).order_by(name: 1).map { |policy| [ policy.name, policy.id] }
704
720
  end
705
721
 
706
722
  ############################################################################
@@ -721,7 +737,7 @@ def dc_choices4_all_collections
721
737
  DrgCms.paths(:forms).reverse.each do |path|
722
738
  filename = "#{path}/cms_menu.yml"
723
739
  next unless File.exist?(filename)
724
- #
740
+
725
741
  menu = YAML.load_file(filename) rescue nil # load menu
726
742
  next if menu.nil? or !menu['menu'] # not menu or error
727
743
  menu['menu'].each do |section|
@@ -748,14 +764,14 @@ def forms_merge(hash1, hash2) #:nodoc:
748
764
  end
749
765
  target[key] = hash2[key] == '/' ? nil : hash2[key]
750
766
  end
751
- # delete keys with nil value
752
- target.delete_if{ |k,v| v.nil? }
767
+ # delete keys with nil value
768
+ target.delete_if{ |k, v| v.nil? }
753
769
  end
754
770
 
755
771
  ##########################################################################
756
772
  # Returns choices for creating collection edit select field on CMS top menu.
757
773
  ##########################################################################
758
- def dc_choices4_cmsmenu()
774
+ def dc_choices4_cmsmenu
759
775
  menus = {}
760
776
  DrgCms.paths(:forms).reverse.each do |path|
761
777
  filename = "#{path}/cms_menu.yml"
@@ -764,7 +780,7 @@ def dc_choices4_cmsmenu()
764
780
  next if menu.nil? or !menu['menu'] # not menu or error
765
781
  menus = forms_merge(menu['menu'], menus) # ignore top level part
766
782
  end
767
- #
783
+
768
784
  html = '<ul>'
769
785
  menus.to_a.sort.each do |index, menu| # sort menus, result is array of sorted hashes
770
786
  next unless menu['caption']
@@ -829,9 +845,11 @@ def dc_choices4(model, name, id='_id', options = {})
829
845
  sites << nil if param == :with_nil
830
846
  qry = qry.in(dc_site_id: sites) if sites
831
847
  end
832
- qry = qry.and(active: true) if model.method_defined?(:active)
833
- choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
834
- choices.sort_alphabetical_by(&:first) # use UTF-8 sort
848
+ qry = qry.and(active: true) if model.method_defined?(:active)
849
+ qry = qry.order_by(name => 1).collation(locale: I18n.locale.to_s)
850
+ #choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
851
+ #choices.sort_alphabetical_by(&:first) # use UTF-8 sort
852
+ qry.map { |e| [e[name], e[id]] }
835
853
  end
836
854
 
837
855
  ############################################################################
@@ -892,35 +910,35 @@ end
892
910
  ############################################################################
893
911
  def dc_user_can_view(ctrl, policy_id)
894
912
  policy_id = policy_id.policy_id if policy_id and policy_id.respond_to?(:policy_id)
895
- # Eventualy object without policy_id will be checked. This is to prevent error
913
+ # Eventualy object without policy_id will be checked. This is to prevent error
896
914
  policy_id = nil unless policy_id.class == BSON::ObjectId
897
- #
915
+
898
916
  site = ctrl.site
899
917
  policies = if site.inherit_policy.blank?
900
918
  site.dc_policies
901
919
  else
902
920
  Mongoid::QueryCache.cache { DcSite.find(site.inherit_policy) }.dc_policies
903
921
  end
904
- # permission defined by default policy
922
+ # permission defined by default policy
905
923
  default_policy = Mongoid::QueryCache.cache { policies.find_by(is_default: true) }
906
924
  return false, 'Default access policy not found for the site!' unless default_policy
907
- #
925
+
908
926
  permissions = {}
909
927
  default_policy.dc_policy_rules.to_a.each { |v| permissions[v.dc_policy_role_id] = v.permission }
910
- # update permissions with defined policy
928
+ # update permissions with defined policy
911
929
  part_policy = nil
912
930
  if policy_id
913
931
  part_policy = Mongoid::QueryCache.cache { policies.find(policy_id) }
914
932
  return false, 'Access policy not found for part!' unless part_policy
915
933
  part_policy.dc_policy_rules.to_a.each { |v| permissions[v.dc_policy_role_id] = v.permission }
916
934
  end
917
- # apply guest role if no roles defined
935
+ # apply guest role if no roles defined
918
936
  if ctrl.session[:user_roles].nil?
919
937
  role = Mongoid::QueryCache.cache { DcPolicyRole.find_by(system_name: 'guest', active: true) }
920
938
  return false, 'System guest role not defined!' unless role
921
939
  ctrl.session[:user_roles] = [role.id]
922
940
  end
923
- # Check if user has any role that allows him to view part
941
+ # Check if user has any role that allows him to view part
924
942
  can_view, msg = false,''
925
943
  ctrl.session[:user_roles].each do |role|
926
944
  next unless permissions[role] # role not yet defined. Will die in next line.
@@ -956,10 +974,10 @@ def dc_user_has_role( role, user=nil, roles=nil )
956
974
  roles = _origin.session[:user_roles] if roles.nil?
957
975
  user = _origin.session[:user_id] if user.nil?
958
976
  return false if user.nil? or roles.nil?
959
- #
977
+
960
978
  role = DcPolicyRole.get_role(role)
961
979
  return false if role.nil?
962
- # role is included in roles array
980
+ # role is included in roles array
963
981
  roles.include?(role._id)
964
982
  end
965
983
 
@@ -998,6 +1016,7 @@ end
998
1016
  ############################################################################
999
1017
  def dc_limit_string(string, size)
1000
1018
  return string if string.size < size
1019
+
1001
1020
  string = string[0,size]
1002
1021
  string.chop! until (string[-1,1] == ' ' or string == '')
1003
1022
  string << '...'
@@ -1025,10 +1044,11 @@ def dc_big_table(key)
1025
1044
  bt = DcBigTable.find_by(key: key, site: dc_get_site._id, active: true)
1026
1045
  bt = DcBigTable.find_by(key: key, site: nil, active: true) if bt.nil?
1027
1046
  return ret if bt.nil?
1028
- #
1047
+
1029
1048
  locale = I18n.locale.to_s
1030
1049
  bt.dc_big_table_values.each do |v| # iterate each value
1031
1050
  next unless v.active
1051
+
1032
1052
  desc = ''
1033
1053
  v.dc_big_table_locales.each do |l| # iterate each locale
1034
1054
  if l.locale == locale
@@ -1083,12 +1103,13 @@ def dc_iframe_edit(table, opts={})
1083
1103
  end
1084
1104
 
1085
1105
  ########################################################################
1086
- # Will return value from internal DRG variables.
1087
- # This objects can be params, session, ...
1106
+ # Will return value from Rails and DRG internal objects.
1107
+ # This objects can be params, session, record, site, page
1088
1108
  #
1089
1109
  # Parameters:
1090
- # [object] String: Internal object holding variable. Current values can be session, params, site, page, class
1110
+ # [object] String: Internal object holding variable. Possible values are session, params, record, site, page, class
1091
1111
  # [var_name] String[symbol]: Variable name (:user_name, 'user_id', ...)
1112
+ # [current_document] Object: If passed and object is 'record' then it will be used for retrieving data.
1092
1113
  #
1093
1114
  # Example:
1094
1115
  # # called when constructing iframe for display
@@ -1100,26 +1121,28 @@ end
1100
1121
  #
1101
1122
  #
1102
1123
  # Returns:
1103
- # Value of variable or nil when not found
1124
+ # Value of variable or error when not found
1104
1125
  ########################################################################
1105
- def dc_internal_var(object, var_name)
1126
+ def dc_internal_var(object, var_name, current_document = nil)
1106
1127
  begin
1107
1128
  case
1108
- when object == 'session' then _origin.session[var_name]
1109
- when object == 'params' then _origin.params[var_name]
1110
- when object == 'site' then _origin.dc_get_site.send(var_name)
1111
- when object == 'page' then _origin.page.send(var_name)
1112
- when object == 'record' then _origin.record.send(var_name)
1113
- when object == 'class' then
1114
- clas, method_name = var_name.split('.')
1115
- klas = clas.classify.constantize
1116
- # call method. Error will be cought below.
1117
- klas.send(method_name)
1118
- else
1119
- 'VARIABLE: UNKNOWN OBJECT'
1129
+ when object == 'session' then _origin.session[var_name]
1130
+ when object == 'params' then _origin.params[var_name]
1131
+ when object == 'site' then _origin.dc_get_site.send(var_name)
1132
+ when object == 'page' then _origin.page.send(var_name)
1133
+ when object == 'record' then
1134
+ current_document ? current_document.send(var_name) : _origin.record.send(var_name)
1135
+ when object == 'class' then
1136
+ clas, method_name = var_name.split('.')
1137
+ klas = clas.classify.constantize
1138
+ # call method. Error will be caught below.
1139
+ klas.send(method_name)
1140
+ else
1141
+ 'VARIABLE: UNKNOWN OBJECT'
1120
1142
  end
1121
1143
  rescue Exception => e
1122
- logger.error "Method dc_internal_var. Runtime error. #{e.message}"
1144
+ Rails.logger.debug "\ndc_internal_var. Runtime error. #{e.message}\n"
1145
+ Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
1123
1146
  'VARIABLE: ERROR'
1124
1147
  end
1125
1148
  end
@@ -1,4 +1,3 @@
1
- #coding: utf-8
2
1
  #--
3
2
  # Copyright (c) 2012+ Damjan Rems
4
3
  #
@@ -37,11 +36,12 @@ field :subject_link, type: String, default: ''
37
36
  field :alt_link, type: String, default: ''
38
37
  field :sub_subject, type: String, default: ''
39
38
  field :picture, type: String
40
- field :gallery, type: Boolean, default: false
39
+ field :gallery, type: Mongoid::Boolean, default: false
41
40
  field :body, type: String, default: ''
42
41
  field :css, type: String, default: ''
43
42
  field :script, type: String, default: ''
44
43
  field :params, type: String
44
+ field :div_class, type: String
45
45
  field :menu_id, type: String
46
46
  field :author_id, type: BSON::ObjectId
47
47
  field :dc_poll_id, type: BSON::ObjectId
@@ -51,7 +51,7 @@ field :user_name, type: String
51
51
  field :valid_from, type: DateTime
52
52
  field :valid_to, type: DateTime
53
53
  field :comments, type: Integer, default: 1 # 0 => not allowed, 1 => allowed
54
- field :active, type: Boolean, default: true
54
+ field :active, type: Mongoid::Boolean, default: true
55
55
  field :created_by, type: BSON::ObjectId
56
56
  field :updated_by, type: BSON::ObjectId
57
57
  field :kats, type: Array # Categories
@@ -83,6 +83,16 @@ before_save :do_before_save
83
83
 
84
84
  validates :publish_date, presence: true
85
85
  validate :validate_images_alt_present
86
+
87
+ after_save :cache_clear
88
+ after_destroy :cache_clear
89
+
90
+ ####################################################################
91
+ # Clear cache if cache is configured
92
+ ####################################################################
93
+ def cache_clear
94
+ DrgCms.cache_clear(:dc_page)
95
+ end
86
96
 
87
97
  ######################################################################
88
98
  # Will return subject_link. Field name link should be common for all documents
@@ -94,7 +104,7 @@ end
94
104
 
95
105
  ######################################################################
96
106
  # Will return validation error if all images in body field do not have
97
- # alt attribute pressent.
107
+ # alt attribute present.
98
108
  ######################################################################
99
109
  def validate_images_alt_present
100
110
  errors.add('body', I18n.t('drgcms.img_alt_not_present')) unless DcPage.images_alt_present?(self.body)
@@ -45,7 +45,7 @@ module DcPieceConcern
45
45
  field :div_id, type: String
46
46
  field :site_id, type: BSON::ObjectId
47
47
  field :order, type: Integer, default: 0
48
- field :active, type: Boolean, default: true
48
+ field :active, type: Mongoid::Boolean, default: true
49
49
  field :valid_from, type: DateTime
50
50
  field :valid_to, type: DateTime
51
51
 
@@ -25,17 +25,20 @@
25
25
  # ActiveSupport::Concern definition for DcPolicyRule class.
26
26
  #########################################################################
27
27
  module DcPolicyRuleConcern
28
- extend ActiveSupport::Concern
29
- included do
28
+ extend ActiveSupport::Concern
29
+ included do
30
30
 
31
- include Mongoid::Document
32
- include Mongoid::Timestamps
31
+ include Mongoid::Document
32
+ include Mongoid::Timestamps
33
33
 
34
- belongs_to :dc_policy_role
34
+ belongs_to :dc_policy_role
35
35
 
36
- field :permission, type: Integer, default: 0
36
+ field :permission, type: Integer, default: 0
37
37
 
38
- embedded_in :policy_rules, polymorphic: true
38
+ embedded_in :policy_rules, polymorphic: true
39
+
40
+ after_save :cache_clear
41
+ after_destroy :cache_clear
39
42
 
40
43
  #########################################################################
41
44
  # Returns values for permissions ready to be used in select field.
@@ -50,7 +53,7 @@ def self.values_for_permissions
50
53
  key = 'helpers.label.dc_policy_rule.choices4_permission'
51
54
  c = I18n.t(key)
52
55
  c = I18n.t(key, locale: 'en') if c.class == Hash or c.match( 'translation missing' )
53
- c.split(',').inject([]) {|r,e| r << (ar = e.split(':'); [ar.first, ar.last.to_i]) }
56
+ c.split(',').inject([]) { |r,e| r << (ar = e.split(':'); [ar.first, ar.last.to_i]) }
54
57
  end
55
58
 
56
59
  #########################################################################
@@ -74,5 +77,14 @@ def self.permission_name_for_value(value)
74
77
  'error'
75
78
  end
76
79
 
80
+ private
81
+
82
+ ####################################################################
83
+ # Clear cache if cache is configured
84
+ ####################################################################
85
+ def cache_clear
86
+ _parent.send(:cache_clear) if _parent.respond_to?(:cache_clear)
87
+ end
88
+
77
89
  end
78
90
  end