drg_cms 0.6.0.8 → 0.6.1.5

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