drg_cms 0.6.0.6 → 0.6.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +92 -36
- data/app/assets/stylesheets/drg_cms/drg_cms.css +141 -101
- data/app/assets/stylesheets/drg_cms/select-multiple.css +9 -12
- data/app/assets/stylesheets/drg_cms_cms.css +1 -1
- data/app/controllers/cmsedit_controller.rb +100 -32
- data/app/controllers/dc_application_controller.rb +71 -12
- data/app/controls/dc_report.rb +227 -0
- data/app/forms/all_options.yml +24 -5
- data/app/forms/dc_big_table.yml +1 -0
- data/app/forms/dc_big_table_value.yml +1 -0
- data/app/forms/dc_poll.yml +12 -5
- data/app/forms/dc_poll_item.yml +2 -1
- data/app/forms/dc_poll_result.yml +9 -0
- data/app/forms/dc_site.yml +2 -6
- data/app/helpers/cms_common_helper.rb +311 -0
- data/app/helpers/{cmsedit_edit_helper.rb → cms_edit_helper.rb} +52 -25
- data/app/helpers/{cmsedit_helper.rb → cms_helper.rb} +38 -31
- data/app/helpers/{cmsedit_index_helper.rb → cms_index_helper.rb} +152 -155
- data/app/helpers/dc_application_helper.rb +20 -234
- data/app/models/concerns/dc_site_concern.rb +12 -1
- data/app/models/dc_filter.rb +10 -8
- data/app/models/dc_permission.rb +30 -0
- data/app/models/dc_poll.rb +1 -0
- data/app/models/dc_poll_result.rb +4 -2
- data/app/models/dc_temp.rb +5 -2
- data/app/models/drgcms_form_fields.rb +12 -1
- data/app/models/drgcms_form_fields/date_picker.rb +4 -3
- data/app/models/drgcms_form_fields/datetime_picker.rb +4 -3
- data/app/models/drgcms_form_fields/drgcms_field.rb +18 -4
- data/app/models/drgcms_form_fields/embedded.rb +17 -9
- data/app/models/drgcms_form_fields/file_field.rb +1 -1
- data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
- data/app/models/drgcms_form_fields/method.rb +65 -0
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +17 -11
- data/app/models/drgcms_form_fields/radio.rb +10 -5
- data/app/models/drgcms_form_fields/readonly.rb +1 -1
- data/app/models/drgcms_form_fields/select.rb +49 -32
- data/app/models/drgcms_form_fields/text_autocomplete.rb +21 -21
- data/app/renderers/dc_big_menu_renderer.rb +1 -0
- data/app/renderers/dc_gallery_renderer.rb +1 -0
- data/app/renderers/dc_menu_renderer.rb +1 -0
- data/app/renderers/dc_page_renderer.rb +1 -0
- data/app/renderers/dc_part_renderer.rb +1 -0
- data/app/renderers/dc_piece_renderer.rb +1 -1
- data/app/renderers/dc_poll_renderer.rb +43 -38
- data/app/renderers/dc_renderer.rb +1 -0
- data/app/renderers/dc_simple_menu_renderer.rb +1 -0
- data/config/locales/drgcms_en.yml +3 -2
- data/config/locales/drgcms_sl.yml +5 -4
- data/config/locales/models_en.yml +9 -2
- data/config/locales/models_sl.yml +10 -3
- data/lib/drg_cms/version.rb +1 -1
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +5 -3
- data/lib/tasks/database.rake +6 -56
- metadata +35 -33
- data/app/helpers/application_helper.rb +0 -2
@@ -261,7 +261,7 @@ end
|
|
261
261
|
def dc_table_title(text, result_set=nil)
|
262
262
|
c = %Q[<div class="dc-title">#{text}]
|
263
263
|
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'})}</div>]
|
264
|
+
c << %Q[<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>]
|
265
265
|
end
|
266
266
|
c << '<div style="clear: both;"></div></div>'
|
267
267
|
c.html_safe
|
@@ -352,7 +352,8 @@ def dc_submit_tag(caption, icon, parms, rest={})
|
|
352
352
|
end
|
353
353
|
end
|
354
354
|
html = icon_image || ''
|
355
|
-
html << submit_tag(t(caption, caption), parms)
|
355
|
+
#html << submit_tag(t(caption, caption), parms)
|
356
|
+
%Q[<button type="submit" class="dc-submit" name="commit" value="#{t(caption, caption)}">#{icon_image} #{t(caption, caption)}</button>].html_safe
|
356
357
|
end
|
357
358
|
|
358
359
|
############################################################################
|
@@ -377,7 +378,7 @@ def dc_link_to(caption, icon, parms, rest={})
|
|
377
378
|
if parms.class == Hash
|
378
379
|
parms.stringify_keys!
|
379
380
|
rest.stringify_keys!
|
380
|
-
rest['class'] = rest['class'].to_s + ' dc-animate'
|
381
|
+
rest['class'] = rest['class'].to_s + ' dc-animate' unless rest['class'].to_s.match('dc-animate')
|
381
382
|
rest['target'] ||= parms.delete('target')
|
382
383
|
parms['controller'] ||= 'cmsedit'
|
383
384
|
icon_pos = parms.delete('icon_pos') || 'first'
|
@@ -655,226 +656,6 @@ def dc_menu_class()
|
|
655
656
|
dc_get_site.menu_class.classify.constantize
|
656
657
|
end
|
657
658
|
|
658
|
-
|
659
|
-
####################################################################
|
660
|
-
# Wrapper for i18 t method, with some spice added. If translation is not found English
|
661
|
-
# translation value will be returned. And if still not found default value will be returned if passed.
|
662
|
-
#
|
663
|
-
# Parameters:
|
664
|
-
# [key] String. String to be translated into locale.
|
665
|
-
# [default] String. Value returned if translation is not found.
|
666
|
-
#
|
667
|
-
# Example:
|
668
|
-
# t('translate.this','Enter text for ....')
|
669
|
-
#
|
670
|
-
# Returns:
|
671
|
-
# String. Translated text.
|
672
|
-
####################################################################
|
673
|
-
def t(key, default=nil)
|
674
|
-
c = I18n.t(key)
|
675
|
-
if c.class == Hash or c.match( 'translation missing' )
|
676
|
-
c = I18n.t(key, locale: 'en')
|
677
|
-
# Still not found. Return default if set
|
678
|
-
if c.class == Hash or c.match( 'translation missing' )
|
679
|
-
c = default.nil? ? key : default
|
680
|
-
end
|
681
|
-
end
|
682
|
-
c
|
683
|
-
end
|
684
|
-
|
685
|
-
####################################################################
|
686
|
-
# Returns table (collection) name translation for usage in dialog title. Tablename
|
687
|
-
# title is provided by helpers.label.table_name.tabletitle locale.
|
688
|
-
#
|
689
|
-
# Parameters:
|
690
|
-
# [tablename] String. Table (collection) name to be translated.
|
691
|
-
# [default] String. Value returned if translation is not found.
|
692
|
-
#
|
693
|
-
# Returns:
|
694
|
-
# String. Translated text.
|
695
|
-
####################################################################
|
696
|
-
def t_tablename(tablename, default=nil)
|
697
|
-
t('helpers.label.' + tablename + '.tabletitle', default || tablename)
|
698
|
-
end
|
699
|
-
|
700
|
-
############################################################################
|
701
|
-
# Returns label for field translated to current locale for usage on data entry form.
|
702
|
-
# Translation is provided by lang.helpers.label.table_name.field_name locale. If
|
703
|
-
# translation is not found method will capitalize field_name and replace '_' with ' '.
|
704
|
-
############################################################################
|
705
|
-
def t_name(field_name, default='')
|
706
|
-
c = t("helpers.label.#{@form['table']}.#{field_name}", default)
|
707
|
-
c = field_name.capitalize.gsub('_',' ') if c.match( 'translation missing' )
|
708
|
-
c
|
709
|
-
end
|
710
|
-
|
711
|
-
############################################################################
|
712
|
-
# When select field is used on form options for select can be provided by
|
713
|
-
# helpers.label.table_name.choices4_name locale. This is how select
|
714
|
-
# field options are translated. Method returns selected choice translated
|
715
|
-
# to current locale.
|
716
|
-
#
|
717
|
-
# Parameters:
|
718
|
-
# [model] String. Table (collection) model name (lowercase).
|
719
|
-
# [field] String. Field name used.
|
720
|
-
# [value] String. Value of field which translation will be returned.
|
721
|
-
#
|
722
|
-
# Example:
|
723
|
-
# # usage in program. Choice values for state are 'Deactivated:0,Active:1,Waiting:2'
|
724
|
-
# dc_name4_value('dc_user', 'state', @record.active )
|
725
|
-
#
|
726
|
-
# # usage in form
|
727
|
-
# columns:
|
728
|
-
# 2:
|
729
|
-
# name: state
|
730
|
-
# eval: dc_name4_value dc_user, state
|
731
|
-
#
|
732
|
-
# Returns:
|
733
|
-
# String. Descriptive text (translated) for selected choice value.
|
734
|
-
############################################################################
|
735
|
-
def dc_name4_value(model, field, value)
|
736
|
-
return '' if value.nil?
|
737
|
-
c = t('helpers.label.' + model + '.choices4_' + field )
|
738
|
-
a = c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
|
739
|
-
a.each {|e| return e.first if e.last.to_s == value.to_s }
|
740
|
-
''
|
741
|
-
end
|
742
|
-
|
743
|
-
############################################################################
|
744
|
-
# Return choices for field in model if choices are defined in localization text.
|
745
|
-
#
|
746
|
-
# Parameters:
|
747
|
-
# [model] String. Table (collection) model name (lowercase).
|
748
|
-
# [field] String. Field name used.
|
749
|
-
#
|
750
|
-
# Example:
|
751
|
-
# dc_choices4_field('dc_user', 'state' )
|
752
|
-
#
|
753
|
-
# Returns:
|
754
|
-
# Array. Choices for select input field
|
755
|
-
############################################################################
|
756
|
-
def dc_choices4_field(model, field)
|
757
|
-
c = t('helpers.label.' + model + '.choices4_' + field )
|
758
|
-
return ['error'] if c.match( 'translation missing' )
|
759
|
-
c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
|
760
|
-
end
|
761
|
-
|
762
|
-
############################################################################
|
763
|
-
# Will return descriptive text for id key when field in one table (collection) has belongs_to
|
764
|
-
# relation to other table.
|
765
|
-
#
|
766
|
-
# Parameters:
|
767
|
-
# [model] String. Table (collection) model name (lowercase).
|
768
|
-
# [field] String. Field name holding the value of descriptive text.
|
769
|
-
# [field_name] String. ID field name. This is by default id, but can be any other
|
770
|
-
# (preferred unique) field.
|
771
|
-
# [value] Value of id_field. Usually a BSON Key but can be any other data type.
|
772
|
-
#
|
773
|
-
# Example:
|
774
|
-
# # usage in program.
|
775
|
-
# dc_name4_id('dc_user', 'name', nil, dc_page.created_by)
|
776
|
-
#
|
777
|
-
# # usage in form
|
778
|
-
# columns:
|
779
|
-
# 2:
|
780
|
-
# name: site_id
|
781
|
-
# eval: dc_name4_id,site,name
|
782
|
-
# # username is saved to document instead of user.id field
|
783
|
-
# 5:
|
784
|
-
# name: user
|
785
|
-
# eval: dc_name4_id,dc_user,name,username
|
786
|
-
#
|
787
|
-
# Returns:
|
788
|
-
# String. Name (descriptive value) for specified key in table.
|
789
|
-
############################################################################
|
790
|
-
def dc_name4_id(model, field, field_name, id=nil)
|
791
|
-
return '' if id.nil?
|
792
|
-
field_name = (field_name || 'id').strip.to_sym
|
793
|
-
field = field.strip.to_sym
|
794
|
-
|
795
|
-
model = model.strip.classify.constantize if model.class == String
|
796
|
-
rec = Mongoid::QueryCache.cache { model.find_by(field_name => id) }
|
797
|
-
rec.nil? ? '' : (rec.send(field) rescue 'not defined')
|
798
|
-
end
|
799
|
-
|
800
|
-
############################################################################
|
801
|
-
# Return html code for icon presenting boolean value. Icon is a picture of checked or unchecked box.
|
802
|
-
#
|
803
|
-
# Parameters:
|
804
|
-
# [value] Boolean.
|
805
|
-
#
|
806
|
-
# Example:
|
807
|
-
# # usage from program
|
808
|
-
# dc_icon4_boolean(some_value)
|
809
|
-
#
|
810
|
-
# # usage from form description
|
811
|
-
# columns:
|
812
|
-
# 10:
|
813
|
-
# name: active
|
814
|
-
# eval: dc_icon4_boolean
|
815
|
-
############################################################################
|
816
|
-
def dc_icon4_boolean(value=false)
|
817
|
-
dc_dont?(value, true) ? fa_icon('square-o lg') : fa_icon('check-square-o lg')
|
818
|
-
end
|
819
|
-
|
820
|
-
############################################################################
|
821
|
-
# Returns html code for displaying date/time formatted by strftime. Will return '' if value is nil.
|
822
|
-
#
|
823
|
-
# Parameters:
|
824
|
-
# [value] Date/DateTime/Time.
|
825
|
-
# [format] String. strftime format mask. Defaults to locale's default format.
|
826
|
-
############################################################################
|
827
|
-
def dc_format_date_time(value, format=nil)
|
828
|
-
return '' if value.nil?
|
829
|
-
format ||= value.class == Date ? t('date.formats.default') : t('time.formats.default')
|
830
|
-
value.strftime(format)
|
831
|
-
end
|
832
|
-
|
833
|
-
####################################################################
|
834
|
-
#
|
835
|
-
####################################################################
|
836
|
-
def dc_date_time(value, format) #:nodoc:
|
837
|
-
dc_deprecate 'dc_date_time will be deprecated! Use dc_format_date_time instead.'
|
838
|
-
dc_format_date_time(value, format)
|
839
|
-
end
|
840
|
-
|
841
|
-
############################################################################
|
842
|
-
# Returns html code for displaying formatted number.
|
843
|
-
#
|
844
|
-
# Parameters:
|
845
|
-
# [value] Numeric number.
|
846
|
-
# [decimals] Integer. Number of decimals
|
847
|
-
# [separator] String. Decimals separator
|
848
|
-
# [delimiter] String. Thousands delimiter.
|
849
|
-
# [currency] String. Currency symbol if applied to result string.
|
850
|
-
############################################################################
|
851
|
-
def dc_format_number(value=0, decimals=nil, separator=nil, delimiter=nil, currency=nil)
|
852
|
-
decimals ||= I18n.t('number.currency.format.precision')
|
853
|
-
separator ||= I18n.t('number.currency.format.separator')
|
854
|
-
separator = '' if decimals == 0
|
855
|
-
delimiter ||= I18n.t('number.currency.format.delimiter')
|
856
|
-
whole, dec = value.to_s.split('.')
|
857
|
-
whole = '0' if whole.blank?
|
858
|
-
# remove and remember sign
|
859
|
-
sign = ''
|
860
|
-
if whole[0] == '-'
|
861
|
-
whole.delete_prefix!('-')
|
862
|
-
sign << '-'
|
863
|
-
end
|
864
|
-
# format decimals
|
865
|
-
dec ||= '0'
|
866
|
-
dec = dec[0,decimals]
|
867
|
-
while dec.size < decimals do dec += '0' end
|
868
|
-
# slice whole on chunks of 3
|
869
|
-
ar = []
|
870
|
-
while whole.size > 0 do
|
871
|
-
n = whole.size >=3 ? 3 : whole.size
|
872
|
-
ar << whole.slice!(n*-1,n)
|
873
|
-
end
|
874
|
-
# put it all back and format
|
875
|
-
"#{sign}#{ar.reverse.join(delimiter)}#{separator}#{dec}"
|
876
|
-
end
|
877
|
-
|
878
659
|
####################################################################
|
879
660
|
# Parse site name from url and return dc_site document. Site document will be cached in
|
880
661
|
# @site variable.
|
@@ -1049,9 +830,6 @@ def dc_choices4(model, name, id='_id', options = {})
|
|
1049
830
|
qry = qry.in(dc_site_id: sites) if sites
|
1050
831
|
end
|
1051
832
|
qry = qry.and(active: true) if model.method_defined?(:active)
|
1052
|
-
# qry = qry.sort(name => 1)
|
1053
|
-
# choices = []
|
1054
|
-
# qry.each {|v| choices << [ v[name], v[id] ] }
|
1055
833
|
choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
|
1056
834
|
choices.sort_alphabetical_by(&:first) # use UTF-8 sort
|
1057
835
|
end
|
@@ -1200,7 +978,8 @@ end
|
|
1200
978
|
####################################################################
|
1201
979
|
def dc_dont?(what, default=false)
|
1202
980
|
return default if what.nil?
|
1203
|
-
|
981
|
+
|
982
|
+
%w(0 n - no none false).include?(what.to_s.downcase.strip)
|
1204
983
|
end
|
1205
984
|
|
1206
985
|
############################################################################
|
@@ -1308,14 +1087,17 @@ end
|
|
1308
1087
|
# This objects can be params, session, ...
|
1309
1088
|
#
|
1310
1089
|
# Parameters:
|
1311
|
-
# [object] String: Internal object holding variable. Current values can be session, params, site, page
|
1090
|
+
# [object] String: Internal object holding variable. Current values can be session, params, site, page, class
|
1312
1091
|
# [var_name] String[symbol]: Variable name (:user_name, 'user_id', ...)
|
1313
1092
|
#
|
1314
1093
|
# Example:
|
1315
1094
|
# # called when constructing iframe for display
|
1316
|
-
# dc_internal_var(session, :user_id)
|
1317
|
-
# dc_internal_var(params, :some_external_parameter)
|
1318
|
-
# dc_internal_var(site, :name)
|
1095
|
+
# dc_internal_var('session', :user_id)
|
1096
|
+
# dc_internal_var('params', :some_external_parameter)
|
1097
|
+
# dc_internal_var('site', :name)
|
1098
|
+
# # or even
|
1099
|
+
# dc_internal_var('class', 'ClassName.class_method_name')
|
1100
|
+
#
|
1319
1101
|
#
|
1320
1102
|
# Returns:
|
1321
1103
|
# Value of variable or nil when not found
|
@@ -1328,8 +1110,13 @@ def dc_internal_var(object, var_name)
|
|
1328
1110
|
when object == 'site' then _origin.dc_get_site.send(var_name)
|
1329
1111
|
when object == 'page' then _origin.page.send(var_name)
|
1330
1112
|
when object == 'record' then _origin.record.send(var_name)
|
1331
|
-
|
1332
|
-
|
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'
|
1333
1120
|
end
|
1334
1121
|
rescue Exception => e
|
1335
1122
|
logger.error "Method dc_internal_var. Runtime error. #{e.message}"
|
@@ -1337,7 +1124,6 @@ def dc_internal_var(object, var_name)
|
|
1337
1124
|
end
|
1338
1125
|
end
|
1339
1126
|
|
1340
|
-
|
1341
1127
|
########################################################################
|
1342
1128
|
# Will return whole path to document if document is embedded in another document.
|
1343
1129
|
#
|
@@ -86,7 +86,7 @@ end
|
|
86
86
|
# Returns class object of menu collection name
|
87
87
|
########################################################################
|
88
88
|
def menu_klass()
|
89
|
-
(
|
89
|
+
(menu_class.blank? ? 'DcMenu' : menu_class).classify.constantize
|
90
90
|
end
|
91
91
|
|
92
92
|
########################################################################
|
@@ -106,5 +106,16 @@ def self.choices4_policies
|
|
106
106
|
[['a','b']]
|
107
107
|
end
|
108
108
|
|
109
|
+
########################################################################
|
110
|
+
# Return choices for selecting policies for the site
|
111
|
+
########################################################################
|
112
|
+
def self.choices_for_menu(menu_class)
|
113
|
+
return [] if menu_class.blank?
|
114
|
+
menu = menu_class.classify.constantize
|
115
|
+
menu.where(active: true).inject([]) do |r, a_menu|
|
116
|
+
r << [a_menu.description, a_menu.id]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
109
120
|
end
|
110
121
|
end
|
data/app/models/dc_filter.rb
CHANGED
@@ -110,35 +110,37 @@ def self.get_filter_field(parent)
|
|
110
110
|
return '' if parent.session[ parent.form['table'] ].nil?
|
111
111
|
filter = parent.session[ parent.form['table'] ][:filter]
|
112
112
|
return '' if filter.nil?
|
113
|
-
|
113
|
+
|
114
114
|
filter = YAML.load(filter) rescue nil
|
115
115
|
return '' if filter.nil?
|
116
|
-
|
116
|
+
|
117
117
|
field = get_field_form_definition(filter['field'], parent)
|
118
118
|
return '' if field.nil? and filter['input'].nil?
|
119
119
|
field = {} if field.nil?
|
120
|
-
# If field has choices available in labels, use them. This is most likely select input field.
|
120
|
+
# If field has choices available in labels, use them. This is most likely select input field.
|
121
121
|
if field['name']
|
122
122
|
choices = parent.t('helpers.label.' + parent.form['table'] + '.choices4_' + field['name'] )
|
123
123
|
unless choices.match( 'translation missing' ) or choices.match('helpers.label')
|
124
124
|
field['choices'] = choices
|
125
125
|
end
|
126
126
|
end
|
127
|
-
# field redefined with input keyword. Name must start with _
|
127
|
+
# field redefined with input keyword. Name must start with _
|
128
128
|
field['name'] = '_filter_field'
|
129
129
|
field['type'] = filter['input'] if filter['input'].to_s.size > 5
|
130
130
|
field['type'] ||= 'text_field'
|
131
131
|
field['readonly'] = false # must be
|
132
132
|
field['html'] ||= {}
|
133
133
|
field['html']['size'] = 20
|
134
|
-
# Start with last entered value
|
135
|
-
field['html']['value']
|
134
|
+
# Start with last entered value
|
135
|
+
field['html']['value'] = filter['value'] unless filter['value'] == '#NIL'
|
136
136
|
field['html']['selected'] = field['html']['value'] # for select field
|
137
|
-
# url for filter ON action
|
137
|
+
# url for filter ON action
|
138
138
|
field['html']['data-url'] = parent.url_for(
|
139
139
|
controller: 'cmsedit',action: :index, filter: 'on',
|
140
|
-
table: parent.form['table'], form_name: parent.
|
140
|
+
table: parent.form['table'], form_name: parent.params['form_name'])
|
141
141
|
url = field['html']['data-url']
|
142
|
+
# remove if present
|
143
|
+
field['with_new'] = nil if field['with_new']
|
142
144
|
# create input field object
|
143
145
|
klas_string = field['type'].camelize
|
144
146
|
klas = DrgcmsFormFields::const_get(klas_string) rescue nil
|
data/app/models/dc_permission.rb
CHANGED
@@ -85,4 +85,34 @@ def self.values_for_permissions #:nodoc:
|
|
85
85
|
[['NO_ACCESS',0],['CAN_VIEW',1],['CAN_CREATE',2],['CAN_EDIT',4],['CAN_EDIT_ALL',8],['CAN_DELETE',16],['CAN_DELETE_ALL',32],['CAN_ADMIN',64],['SUPERADMIN',128]]
|
86
86
|
end
|
87
87
|
|
88
|
+
#############################################################################
|
89
|
+
# Will return permissions for collection
|
90
|
+
############################################################################
|
91
|
+
def self.permissions_for_table(collection_name)
|
92
|
+
if collection_name.match(';')
|
93
|
+
collection, embedded, rest = collection_name.split(';')
|
94
|
+
else
|
95
|
+
collection, embedded = collection_name, nil
|
96
|
+
end
|
97
|
+
result = permissions_for('*')
|
98
|
+
result = permissions_for("#{collection[0,3]}*", result)
|
99
|
+
result = permissions_for(collection, result)
|
100
|
+
# include permissions for embedded documents
|
101
|
+
result = permissions_for("#{collection};#{embedded}", result) if embedded
|
102
|
+
result
|
103
|
+
end
|
104
|
+
|
105
|
+
#############################################################################
|
106
|
+
#
|
107
|
+
############################################################################
|
108
|
+
def self.permissions_for(collection_name, result = {}) #:nodoc:
|
109
|
+
permissions = if collection_name == '*'
|
110
|
+
self.find_by(is_default: true)
|
111
|
+
else
|
112
|
+
self.find_by(table_name: collection_name, active: true)
|
113
|
+
end
|
114
|
+
permissions.dc_policy_rules.each {|perm| result[perm.dc_policy_role_id] = perm.permission } if permissions
|
115
|
+
result
|
116
|
+
end
|
117
|
+
|
88
118
|
end
|
data/app/models/dc_poll.rb
CHANGED
@@ -63,6 +63,7 @@ field :operation, type: String
|
|
63
63
|
field :parameters, type: String
|
64
64
|
field :display, type: String, default: '1'
|
65
65
|
field :css, type: String
|
66
|
+
field :js, type: String
|
66
67
|
field :form, type: String
|
67
68
|
field :valid_from, type: DateTime
|
68
69
|
field :valid_to, type: DateTime
|
@@ -29,15 +29,17 @@
|
|
29
29
|
# _id BSON::ObjectId _id
|
30
30
|
# dc_poll_id BSON::ObjectId poll id
|
31
31
|
# data String Data saved as YAML
|
32
|
-
#
|
32
|
+
# confirmed Boolean Poll entry was confirmed
|
33
|
+
#
|
33
34
|
# Results of polls saved as YAML structure.
|
34
35
|
########################################################################
|
35
36
|
class DcPollResult
|
36
37
|
include Mongoid::Document
|
37
38
|
include Mongoid::Timestamps
|
38
39
|
|
39
|
-
field :data, type: String
|
40
40
|
belongs_to :dc_poll
|
41
|
+
field :data, type: String
|
42
|
+
field :confirmed, type: Boolean, default: false
|
41
43
|
|
42
44
|
index( { dc_poll_id: 1 } )
|
43
45
|
|