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.
- checksums.yaml +4 -4
- data/README.md +25 -10
- data/app/assets/javascripts/drg_cms/drg_cms.js +208 -81
- data/app/assets/stylesheets/drg_cms/drg_cms.css +298 -93
- data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
- data/app/controllers/cmsedit_controller.rb +174 -167
- data/app/controllers/dc_application_controller.rb +230 -196
- data/app/controllers/dc_common_controller.rb +88 -50
- data/app/controls/dc_help_control.rb +138 -0
- data/app/controls/dc_report.rb +12 -16
- data/app/forms/all_options.yml +14 -5
- data/app/forms/cms_menu.yml +7 -1
- data/app/forms/dc_big_table.yml +0 -2
- data/app/forms/dc_big_table_value.yml +0 -2
- data/app/forms/dc_category.yml +2 -1
- data/app/forms/dc_design.yml +2 -2
- data/app/forms/dc_folder_permission.yml +0 -2
- data/app/forms/dc_help_1.yml +110 -0
- data/app/forms/dc_journal.yml +3 -1
- data/app/forms/dc_json_ld.yml +0 -3
- data/app/forms/dc_link.yml +1 -1
- data/app/forms/dc_menu.yml +8 -12
- data/app/forms/dc_menu_item.yml +2 -3
- data/app/forms/dc_page.yml +7 -2
- data/app/forms/dc_part.yml +1 -0
- data/app/forms/dc_piece.yml +1 -0
- data/app/forms/dc_policy.yml +2 -5
- data/app/forms/dc_poll.yml +13 -16
- data/app/forms/dc_seo.yml +1 -2
- data/app/forms/dc_simple_menu.yml +3 -2
- data/app/forms/dc_site.yml +5 -8
- data/app/forms/dc_user.yml +27 -11
- data/app/forms/dc_user_role.yml +3 -0
- data/app/helpers/cms_common_helper.rb +68 -4
- data/app/helpers/cms_edit_helper.rb +73 -55
- data/app/helpers/cms_helper.rb +70 -32
- data/app/helpers/cms_index_helper.rb +155 -102
- data/app/helpers/dc_application_helper.rb +132 -109
- data/app/models/concerns/dc_page_concern.rb +14 -4
- data/app/models/concerns/dc_piece_concern.rb +1 -1
- data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
- data/app/models/concerns/dc_site_concern.rb +56 -44
- data/app/models/concerns/dc_user_concern.rb +58 -19
- data/app/models/dc_big_table.rb +2 -2
- data/app/models/dc_design.rb +29 -19
- data/app/models/dc_filter.rb +28 -22
- data/app/models/dc_key_value_store.rb +1 -0
- data/app/models/dc_permission.rb +19 -9
- data/app/models/dc_policy.rb +25 -14
- data/app/models/dc_policy_role.rb +22 -11
- data/app/models/dc_temp.rb +8 -1
- data/app/models/dc_user_role.rb +2 -2
- data/app/models/drgcms_form_fields/comment.rb +11 -2
- data/app/models/drgcms_form_fields/date_picker.rb +2 -0
- data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
- data/app/models/drgcms_form_fields/embedded.rb +9 -10
- data/app/models/drgcms_form_fields/file_field.rb +1 -1
- data/app/models/drgcms_form_fields/file_select.rb +2 -2
- data/app/models/drgcms_form_fields/hash_field.rb +11 -7
- data/app/models/drgcms_form_fields/link_to.rb +2 -2
- data/app/models/drgcms_form_fields/method.rb +5 -4
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +1 -1
- data/app/models/drgcms_form_fields/number_field.rb +4 -3
- data/app/models/drgcms_form_fields/readonly.rb +13 -17
- data/app/models/drgcms_form_fields/select.rb +24 -25
- data/app/models/drgcms_form_fields/text_autocomplete.rb +22 -14
- data/app/renderers/dc_page_renderer.rb +7 -6
- data/app/renderers/dc_poll_renderer.rb +16 -20
- data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
- data/app/views/cmsedit/_form.html.erb +3 -2
- data/app/views/cmsedit/_result.html.erb +21 -18
- data/app/views/cmsedit/edit.html.erb +4 -1
- data/app/views/cmsedit/index.html.erb +3 -2
- data/app/views/cmsedit/new.html.erb +5 -2
- data/app/views/dc_common/_help.html.erb +17 -0
- data/app/views/layouts/models.html.erb +2 -1
- data/config/locales/drgcms_en.yml +17 -2
- data/config/locales/drgcms_sl.yml +20 -2
- data/config/locales/models_en.yml +7 -5
- data/config/locales/models_sl.yml +12 -9
- data/drg_cms.gemspec +16 -16
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +94 -2
- metadata +32 -30
- 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
|
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
|
-
%
|
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 = %
|
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 << %
|
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
|
-
|
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
|
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
|
-
# [
|
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(
|
442
|
-
|
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
|
466
|
-
|
467
|
-
doc.errors.
|
468
|
-
label = t("helpers.label.#{decamelize_type(doc.class)}.#{attribute}", attribute)
|
469
|
-
|
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
|
-
|
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
|
-
|
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 = %
|
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
|
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
|
-
|
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
|
-
|
677
|
-
|
678
|
-
|
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
|
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.
|
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
|
833
|
-
|
834
|
-
choices.
|
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
|
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.
|
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
|
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
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
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.
|
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
|
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
|
-
|
29
|
-
|
28
|
+
extend ActiveSupport::Concern
|
29
|
+
included do
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
include Mongoid::Document
|
32
|
+
include Mongoid::Timestamps
|
33
33
|
|
34
|
-
|
34
|
+
belongs_to :dc_policy_role
|
35
35
|
|
36
|
-
|
36
|
+
field :permission, type: Integer, default: 0
|
37
37
|
|
38
|
-
|
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
|