drg_cms 0.6.0.1 → 0.6.1.1.1

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +454 -145
  3. data/app/assets/javascripts/drg_cms_application.js +1 -1
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +635 -244
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
  6. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  7. data/app/controllers/cmsedit_controller.rb +515 -335
  8. data/app/controllers/dc_application_controller.rb +378 -111
  9. data/app/controllers/dc_common_controller.rb +105 -14
  10. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  11. data/app/controls/dc_help_control.rb +126 -0
  12. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  13. data/app/controls/dc_poll_result_control.rb +88 -0
  14. data/app/controls/dc_report.rb +223 -0
  15. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  16. data/app/forms/all_options.yml +44 -9
  17. data/app/forms/cms_menu.yml +28 -18
  18. data/app/forms/dc_ad.yml +11 -22
  19. data/app/forms/dc_big_table.yml +1 -0
  20. data/app/forms/dc_big_table_value.yml +1 -0
  21. data/app/forms/dc_category.yml +2 -1
  22. data/app/forms/dc_design.yml +20 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_help_1.yml +109 -0
  25. data/app/forms/dc_journal.yml +3 -1
  26. data/app/forms/dc_json_ld.yml +59 -0
  27. data/app/forms/dc_key_value.yml +32 -0
  28. data/app/forms/dc_link.yml +1 -1
  29. data/app/forms/dc_menu.yml +2 -0
  30. data/app/forms/dc_menu_item.yml +2 -0
  31. data/app/forms/dc_page.yml +3 -5
  32. data/app/forms/dc_part.yml +1 -0
  33. data/app/forms/dc_piece.yml +1 -0
  34. data/app/forms/dc_poll.yml +15 -5
  35. data/app/forms/dc_poll_item.yml +2 -1
  36. data/app/forms/dc_poll_result.yml +83 -0
  37. data/app/forms/dc_poll_result_export.yml +35 -0
  38. data/app/forms/dc_seo.yml +33 -0
  39. data/app/forms/dc_simple_menu.yml +2 -0
  40. data/app/forms/dc_site.yml +4 -12
  41. data/app/forms/dc_user.yml +27 -11
  42. data/app/forms/dc_user_role.yml +3 -0
  43. data/app/forms/json_ld_schema.yml +168 -0
  44. data/app/helpers/cms_common_helper.rb +375 -0
  45. data/app/helpers/cms_edit_helper.rb +506 -0
  46. data/app/helpers/cms_helper.rb +268 -0
  47. data/app/helpers/cms_index_helper.rb +580 -0
  48. data/app/helpers/dc_application_helper.rb +218 -306
  49. data/app/models/concerns/dc_page_concern.rb +40 -6
  50. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  51. data/app/models/concerns/dc_seo_concern.rb +66 -0
  52. data/app/models/concerns/dc_site_concern.rb +67 -44
  53. data/app/models/concerns/dc_user_concern.rb +57 -18
  54. data/app/models/dc_design.rb +30 -18
  55. data/app/models/dc_filter.rb +22 -13
  56. data/app/models/dc_json_ld.rb +152 -0
  57. data/app/models/dc_key_value.rb +48 -0
  58. data/app/models/dc_key_value_store.rb +1 -0
  59. data/app/models/dc_memory.rb +8 -1
  60. data/app/models/dc_page.rb +0 -1
  61. data/app/models/dc_permission.rb +49 -9
  62. data/app/models/dc_policy.rb +25 -14
  63. data/app/models/dc_policy_role.rb +22 -11
  64. data/app/models/dc_poll.rb +39 -19
  65. data/app/models/dc_poll_result.rb +46 -0
  66. data/app/models/dc_temp.rb +140 -0
  67. data/app/models/dc_user_role.rb +2 -2
  68. data/app/models/drgcms_form_fields.rb +12 -1
  69. data/app/models/drgcms_form_fields/action.rb +61 -0
  70. data/app/models/drgcms_form_fields/comment.rb +8 -4
  71. data/app/models/drgcms_form_fields/date_picker.rb +11 -9
  72. data/app/models/drgcms_form_fields/date_select.rb +1 -1
  73. data/app/models/drgcms_form_fields/datetime_picker.rb +12 -10
  74. data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
  75. data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
  76. data/app/models/drgcms_form_fields/embedded.rb +26 -16
  77. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  78. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  79. data/app/models/drgcms_form_fields/hash_field.rb +90 -0
  80. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  81. data/app/models/drgcms_form_fields/html_field.rb +1 -1
  82. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  83. data/app/models/drgcms_form_fields/method.rb +66 -0
  84. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
  85. data/app/models/drgcms_form_fields/number_field.rb +15 -6
  86. data/app/models/drgcms_form_fields/radio.rb +96 -0
  87. data/app/models/drgcms_form_fields/readonly.rb +2 -2
  88. data/app/models/drgcms_form_fields/select.rb +92 -29
  89. data/app/models/drgcms_form_fields/text_area.rb +1 -1
  90. data/app/models/drgcms_form_fields/text_autocomplete.rb +31 -17
  91. data/app/models/drgcms_form_fields/text_field.rb +1 -1
  92. data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
  93. data/app/models/drgcms_form_fields/tree_select.rb +15 -4
  94. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  95. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  96. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  97. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  98. data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
  99. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  100. data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
  101. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  102. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  103. data/app/{helpers → renderers}/dc_poll_renderer.rb +91 -64
  104. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  105. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  106. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  107. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  108. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  109. data/app/views/cmsedit/_form.html.erb +4 -3
  110. data/app/views/cmsedit/_result.html.erb +2 -3
  111. data/app/views/cmsedit/edit.html.erb +4 -1
  112. data/app/views/cmsedit/index.html.erb +7 -1
  113. data/app/views/cmsedit/new.html.erb +3 -1
  114. data/app/views/dc_common/_help.html.erb +17 -0
  115. data/app/views/layouts/models.html.erb +2 -1
  116. data/config/locales/drgcms_en.yml +27 -3
  117. data/config/locales/drgcms_sl.yml +32 -5
  118. data/config/locales/models_en.yml +65 -17
  119. data/config/locales/models_sl.yml +69 -18
  120. data/drg_cms.gemspec +1 -1
  121. data/lib/drg_cms.rb +61 -1
  122. data/lib/drg_cms/version.rb +1 -1
  123. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  124. data/lib/tasks/database.rake +6 -56
  125. metadata +73 -54
  126. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  127. data/app/helpers/application_helper.rb +0 -2
  128. data/app/helpers/cmsedit_helper.rb +0 -888
  129. data/app/models/dc_dummy.rb +0 -102
  130. data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -31,6 +31,7 @@
31
31
  # updated_at Time updated_at
32
32
  # description String Short description of design
33
33
  # body String Body of design which will be rendered like any Rails view
34
+ # params String Parameters used by design
34
35
  # css String CSS for design
35
36
  # rails_view String Rails view (file) name which will be used to render design
36
37
  # author String Creater if design
@@ -86,24 +87,35 @@
86
87
  # <style type="text/css"><%= @css.html_safe %></style><%= javascript_tag @js %>
87
88
  ########################################################################
88
89
  class DcDesign
89
- include Mongoid::Document
90
- include Mongoid::Timestamps
91
-
92
- field :description, type: String, default: ''
93
- field :body, type: String, default: ''
94
- field :css, type: String, default: ''
95
- field :rails_view, type: String, default: ''
96
- field :control, type: String, default: ''
97
- field :control_method, type: String, default: ''
98
- field :author, type: String
99
- field :active, type: Boolean, default: true
100
- field :created_by, type: BSON::ObjectId
101
- field :updated_by, type: BSON::ObjectId
102
- field :site_id, type: BSON::ObjectId
103
-
104
- embeds_many :dc_parts
105
-
106
- validates_length_of :description, minimum: 5
90
+ include Mongoid::Document
91
+ include Mongoid::Timestamps
92
+
93
+ field :description, type: String, default: ''
94
+ field :body, type: String, default: ''
95
+ field :css, type: String, default: ''
96
+ field :rails_view, type: String, default: ''
97
+ field :control, type: String, default: ''
98
+ field :params, type: String, default: ''
99
+ field :control_method, type: String, default: ''
100
+ field :author, type: String
101
+ field :active, type: Boolean, default: true
102
+ field :created_by, type: BSON::ObjectId
103
+ field :updated_by, type: BSON::ObjectId
104
+ field :site_id, type: BSON::ObjectId
105
+
106
+ embeds_many :dc_parts
107
+
108
+ validates_length_of :description, minimum: 5
109
+
110
+ after_save :cache_clear
111
+ after_destroy :cache_clear
112
+
113
+ ####################################################################
114
+ # Clear cache if cache is configured
115
+ ####################################################################
116
+ def cache_clear
117
+ DrgCms.cache_clear(:dc_design)
118
+ end
107
119
 
108
120
  ########################################################################
109
121
  # Return choices for select for design_id.
@@ -110,45 +110,54 @@ 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'] = filter['value'] unless filter['value'] == '#NIL'
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.form['form_name'])
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
145
147
  return '' if klas.nil?
146
148
  # return data from object and create html code to display field
147
- object = klas.new(parent, nil, field).render
148
- js = object.js
149
- "<span class=\"filter_field\" data-url=\"#{url}\">#{object.html} " <<
150
- parent.fa_icon('filter lg', class: 'record_filter_field_icon dc-link-icon dc-animate') <<
151
- (js.size > 2 ? parent.javascript_tag(js) : '') << '</span>'
149
+ object = klas.new(parent, nil, field).render rescue nil
150
+ # Error. Forget filter and return
151
+ if object.nil?
152
+ parent.session[ parent.form['table'] ][:filter] = nil
153
+ return ''
154
+ end
155
+ js = object.js.blank? ? '' : parent.javascript_tag(object.js)
156
+ %Q[<li class="no-background">
157
+ <span class="filter_field" data-url="#{url}">#{object.html}
158
+ #{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
159
+ #{js}</span>
160
+ </li>]
152
161
  end
153
162
 
154
163
  ######################################################################
@@ -0,0 +1,152 @@
1
+ #--
2
+ # Copyright (c) 2019+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ ########################################################################
25
+ # == Schema information
26
+ #
27
+ # Collection name: dc_json_ld : JSON_LD data for site optimization
28
+ #
29
+ # _id BSON::ObjectId _id
30
+ # type String Type of structure
31
+ # data String Structure data in YAML
32
+ # dc_json_lds Object Can embed substructure
33
+ # created_at Time created_at
34
+ # updated_at Time Last updated at
35
+ # created_by BSON::ObjectId created_by
36
+ # updated_by BSON::ObjectId Last updated by
37
+ #
38
+ ########################################################################
39
+ class DcJsonLd
40
+ include Mongoid::Document
41
+ include Mongoid::Timestamps
42
+
43
+ field :name, type: String
44
+ field :type, type: String
45
+ field :data, type: String
46
+ field :active, type: Boolean, default: true
47
+
48
+ embeds_many :dc_json_lds, :cyclic => true
49
+
50
+ field :created_by, type: BSON::ObjectId
51
+ field :updated_by, type: BSON::ObjectId
52
+
53
+ validates :name, presence: true
54
+ validates :type, presence: true
55
+
56
+ ##########################################################################
57
+ # Returns JSON LD data as YAML
58
+ ##########################################################################
59
+ def get_json_ld(parent_data)
60
+ yaml = (YAML.load(self.data) rescue nil) || {}
61
+ yaml['@type'] = self.type if yaml.size > 0
62
+ if dc_json_lds.size > 0
63
+ dc_json_lds.where(active: true).each do |element|
64
+ yml = element.get_json_ld(parent_data)
65
+ if yml.size > 0
66
+ yaml[element.name] ||= []
67
+ yaml[element.name] << yml
68
+ end
69
+ end
70
+ end
71
+ yaml
72
+ end
73
+
74
+ ########################################################################
75
+ # Searches forms path for file_name and returns full file name or nil if not found.
76
+ #
77
+ # @param [String] Form file name. File name can be passed as gem_name.filename. This can
78
+ # be useful when you are extending form but want to retain same name as original form
79
+ # For example. You are extending dc_user form from drg_cms gem and want to
80
+ # retain same dc_user name. This can be done by setting drg_cms.dc_user to extend option.
81
+ #
82
+ # @return [String] Form file name including path or nil if not found.
83
+ ########################################################################
84
+ def self.dc_find_form_file(form_file)
85
+ form_path=nil
86
+ if form_file.match(/\.|\//)
87
+ form_path,form_file=form_file.split(/\.|\//)
88
+ end
89
+ DrgCms.paths(:forms).reverse.each do |path|
90
+ f = "#{path}/#{form_file}.yml"
91
+ return f if File.exist?(f) and (form_path.nil? or path.to_s.match(/\/#{form_path}\//i))
92
+ end
93
+ p "Form file #{form_file} not found!"
94
+ nil
95
+ end
96
+
97
+ ########################################################################
98
+ # Find document by ids when document are embedded into main d even if embedded
99
+ #
100
+ # @param [tables] Tables parameter as send in url. Tables are separated by ;
101
+ # @param [ids] ids as send in url. ids are separated by ;
102
+ #
103
+ # @return [Document]
104
+ ########################################################################
105
+ def self.find_document_by_ids(tables, ids)
106
+ collection = tables.split(';').first.classify.constantize
107
+ ar_ids = ids.split(';')
108
+ # Find top document
109
+ document = collection.find(ar_ids.shift)
110
+ # Search for embedded document
111
+ ar_ids.each {|id| document = document.dc_json_lds.find(id) }
112
+ document
113
+ end
114
+
115
+ #########################################################################
116
+ # Returns possible options for type select field on form.
117
+ #########################################################################
118
+ def self.choices4_type()
119
+ yaml = YAML.load_file( dc_find_form_file('json_ld_schema') )
120
+
121
+ yaml.inject([]) {|result, schema_name| result << schema_name.first }
122
+ end
123
+
124
+ #########################################################################
125
+ # Create menu to add schema element. Called from DRGCMS Form action.
126
+ #########################################################################
127
+ def self.add_schema_menu(parent)
128
+ yaml = YAML.load_file( dc_find_form_file('json_ld_schema') )
129
+ if (level = parent.params['ids'].split(';').size) == 1
130
+ # select only top level elements
131
+ yaml.delete_if { |schema_name, schema_data| schema_data['level'].nil? }
132
+ else
133
+ # select only elemets which are subelements of type
134
+ parent_type = self.find_document_by_ids(parent.params['table'],parent.params['ids']).type
135
+ _yaml = []
136
+ yaml[parent_type].each do |name, data|
137
+ next unless data.class == Hash
138
+ _yaml << [data['type'], yaml[data['type']] ] if data['type'] and yaml[data['type']]
139
+ end
140
+ yaml = _yaml
141
+ end
142
+ # create menu code
143
+ html = '<ul>'
144
+ yaml.each do |schema_name, schema_data|
145
+ next if level == 1 and schema_data['level'].nil?
146
+ url = "/dc_common/add_json_ld_schema?table=#{parent.params['table']}&ids=#{parent.params['ids']}&schema=#{schema_name}&url=#{parent.request.url}"
147
+ html << %Q[<li class="dc-link-ajax dc-animate" data-url="#{url}">#{schema_name}</li>]
148
+ end
149
+ html << '</ul>'
150
+ end
151
+
152
+ end
@@ -0,0 +1,48 @@
1
+ #--
2
+ # Copyright (c) 2019+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ #########################################################################
25
+ # == Schema information
26
+ #
27
+ # Collection name: dc_key_value : Key value items
28
+ #
29
+ # _id BSON::ObjectId _id
30
+ # key String Key
31
+ # value String Value
32
+ #
33
+ # Key-Value items can be embedded into any model and are replacing Hash fields.
34
+ # They can also appear cyclic if required.
35
+ #########################################################################
36
+ class DcKeyValue
37
+ include Mongoid::Document
38
+ include Mongoid::Timestamps
39
+
40
+ field :key, type: String
41
+ field :value, type: String
42
+
43
+ field :created_by, type: BSON::ObjectId
44
+ field :updated_by, type: BSON::ObjectId
45
+
46
+ embedded_in :key_values, polymorphic: true
47
+
48
+ end
@@ -128,6 +128,7 @@ def self.set_value(value, *keys)
128
128
  else
129
129
  create(key: keys.join('-'), value: value)
130
130
  end
131
+ value
131
132
  end
132
133
 
133
134
  end
@@ -74,12 +74,19 @@ def initialize(parms = {})
74
74
  end
75
75
 
76
76
  ########################################################################
77
- # Respond_to should always return true.
77
+ # Return id field
78
78
  ########################################################################
79
79
  def id()
80
80
  @internals['id']
81
81
  end
82
82
 
83
+ ########################################################################
84
+ # Respond_to should always return true.
85
+ ########################################################################
86
+ def id=(value)
87
+ @internals['id'] = value
88
+ end
89
+
83
90
  ########################################################################
84
91
  # Respond_to should always return true.
85
92
  ########################################################################
@@ -31,7 +31,6 @@
31
31
  # created_at Time created_at
32
32
  # updated_at Time Updated
33
33
  # subject String Articles subject
34
- # title String Browser title. Optimization for SEO.
35
34
  # subject_link String Friendly link defined
36
35
  # alt_link String Alternative link, by which page could be found
37
36
  # sub_subject String Sub subject, short description of text
@@ -44,23 +44,23 @@ class DcPermission
44
44
  #- Available permissions settings
45
45
 
46
46
  # User has no access
47
- NO_ACCESS = 0
47
+ NO_ACCESS = 0
48
48
  # User can view documents
49
- CAN_VIEW = 1
49
+ CAN_VIEW = 1
50
50
  # User can create new documents
51
- CAN_CREATE = 2
51
+ CAN_CREATE = 2
52
52
  # User can edit his own documents
53
- CAN_EDIT = 4
53
+ CAN_EDIT = 4
54
54
  # User can edit all documents in collection
55
- CAN_EDIT_ALL = 8
55
+ CAN_EDIT_ALL = 8
56
56
  # User can delete his own documents
57
- CAN_DELETE = 16
57
+ CAN_DELETE = 16
58
58
  # User can delete all documents in collection
59
59
  CAN_DELETE_ALL = 32
60
60
  # User can admin collection (same as can_delete_all, but can see documents which do not belong to current site)
61
- CAN_ADMIN = 64
61
+ CAN_ADMIN = 64
62
62
  # User is superadmin. Basicly same as admin.
63
- SUPERADMIN = 128
63
+ SUPERADMIN = 128
64
64
 
65
65
  include Mongoid::Document
66
66
  include Mongoid::Timestamps
@@ -75,7 +75,17 @@ embeds_many :dc_policy_rules, as: :policy_rules
75
75
  index( { table_name: 1 }, { unique: true } )
76
76
 
77
77
  validates :table_name, presence: true
78
- validates :table_name, uniqueness: true
78
+ validates :table_name, uniqueness: true
79
+
80
+ after_save :cache_clear
81
+ after_destroy :cache_clear
82
+
83
+ ####################################################################
84
+ # Clear cache if cache is configured
85
+ ####################################################################
86
+ def cache_clear
87
+ DrgCms.cache_clear(:dc_permission)
88
+ end
79
89
 
80
90
  ########################################################################
81
91
  # Will return choices for permissions prepared for usega in select input field.
@@ -85,4 +95,34 @@ def self.values_for_permissions #:nodoc:
85
95
  [['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
96
  end
87
97
 
98
+ #############################################################################
99
+ # Will return permissions for collection
100
+ ############################################################################
101
+ def self.permissions_for_table(collection_name)
102
+ if collection_name.match(';')
103
+ collection, embedded, rest = collection_name.split(';')
104
+ else
105
+ collection, embedded = collection_name, nil
106
+ end
107
+ result = permissions_for('*')
108
+ result = permissions_for("#{collection[0,3]}*", result)
109
+ result = permissions_for(collection, result)
110
+ # include permissions for embedded documents
111
+ result = permissions_for("#{collection};#{embedded}", result) if embedded
112
+ result
113
+ end
114
+
115
+ #############################################################################
116
+ #
117
+ ############################################################################
118
+ def self.permissions_for(collection_name, result = {}) #:nodoc:
119
+ permissions = if collection_name == '*'
120
+ self.find_by(is_default: true)
121
+ else
122
+ self.find_by(table_name: collection_name, active: true)
123
+ end
124
+ permissions.dc_policy_rules.each {|perm| result[perm.dc_policy_role_id] = perm.permission } if permissions
125
+ result
126
+ end
127
+
88
128
  end