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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +454 -145
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +635 -244
- data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
- data/app/assets/stylesheets/drg_cms_cms.css +1 -1
- data/app/controllers/cmsedit_controller.rb +515 -335
- data/app/controllers/dc_application_controller.rb +378 -111
- data/app/controllers/dc_common_controller.rb +105 -14
- data/app/{controllers → controls}/browse_models_control.rb +0 -0
- data/app/controls/dc_help_control.rb +126 -0
- data/app/{controllers → controls}/dc_page_control.rb +24 -8
- data/app/controls/dc_poll_result_control.rb +88 -0
- data/app/controls/dc_report.rb +223 -0
- data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
- data/app/forms/all_options.yml +44 -9
- data/app/forms/cms_menu.yml +28 -18
- data/app/forms/dc_ad.yml +11 -22
- data/app/forms/dc_big_table.yml +1 -0
- data/app/forms/dc_big_table_value.yml +1 -0
- data/app/forms/dc_category.yml +2 -1
- data/app/forms/dc_design.yml +20 -16
- data/app/forms/dc_filter.yml +3 -6
- data/app/forms/dc_help_1.yml +109 -0
- data/app/forms/dc_journal.yml +3 -1
- data/app/forms/dc_json_ld.yml +59 -0
- data/app/forms/dc_key_value.yml +32 -0
- data/app/forms/dc_link.yml +1 -1
- data/app/forms/dc_menu.yml +2 -0
- data/app/forms/dc_menu_item.yml +2 -0
- data/app/forms/dc_page.yml +3 -5
- data/app/forms/dc_part.yml +1 -0
- data/app/forms/dc_piece.yml +1 -0
- data/app/forms/dc_poll.yml +15 -5
- data/app/forms/dc_poll_item.yml +2 -1
- data/app/forms/dc_poll_result.yml +83 -0
- data/app/forms/dc_poll_result_export.yml +35 -0
- data/app/forms/dc_seo.yml +33 -0
- data/app/forms/dc_simple_menu.yml +2 -0
- data/app/forms/dc_site.yml +4 -12
- data/app/forms/dc_user.yml +27 -11
- data/app/forms/dc_user_role.yml +3 -0
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/cms_common_helper.rb +375 -0
- data/app/helpers/cms_edit_helper.rb +506 -0
- data/app/helpers/cms_helper.rb +268 -0
- data/app/helpers/cms_index_helper.rb +580 -0
- data/app/helpers/dc_application_helper.rb +218 -306
- data/app/models/concerns/dc_page_concern.rb +40 -6
- data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
- data/app/models/concerns/dc_seo_concern.rb +66 -0
- data/app/models/concerns/dc_site_concern.rb +67 -44
- data/app/models/concerns/dc_user_concern.rb +57 -18
- data/app/models/dc_design.rb +30 -18
- data/app/models/dc_filter.rb +22 -13
- data/app/models/dc_json_ld.rb +152 -0
- data/app/models/dc_key_value.rb +48 -0
- data/app/models/dc_key_value_store.rb +1 -0
- data/app/models/dc_memory.rb +8 -1
- data/app/models/dc_page.rb +0 -1
- data/app/models/dc_permission.rb +49 -9
- data/app/models/dc_policy.rb +25 -14
- data/app/models/dc_policy_role.rb +22 -11
- data/app/models/dc_poll.rb +39 -19
- data/app/models/dc_poll_result.rb +46 -0
- data/app/models/dc_temp.rb +140 -0
- data/app/models/dc_user_role.rb +2 -2
- data/app/models/drgcms_form_fields.rb +12 -1
- data/app/models/drgcms_form_fields/action.rb +61 -0
- data/app/models/drgcms_form_fields/comment.rb +8 -4
- data/app/models/drgcms_form_fields/date_picker.rb +11 -9
- data/app/models/drgcms_form_fields/date_select.rb +1 -1
- data/app/models/drgcms_form_fields/datetime_picker.rb +12 -10
- data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
- data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
- data/app/models/drgcms_form_fields/embedded.rb +26 -16
- data/app/models/drgcms_form_fields/file_field.rb +52 -0
- data/app/models/drgcms_form_fields/file_select.rb +2 -2
- data/app/models/drgcms_form_fields/hash_field.rb +90 -0
- data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
- data/app/models/drgcms_form_fields/html_field.rb +1 -1
- data/app/models/drgcms_form_fields/link_to.rb +2 -2
- data/app/models/drgcms_form_fields/method.rb +66 -0
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
- data/app/models/drgcms_form_fields/number_field.rb +15 -6
- data/app/models/drgcms_form_fields/radio.rb +96 -0
- data/app/models/drgcms_form_fields/readonly.rb +2 -2
- data/app/models/drgcms_form_fields/select.rb +92 -29
- data/app/models/drgcms_form_fields/text_area.rb +1 -1
- data/app/models/drgcms_form_fields/text_autocomplete.rb +31 -17
- data/app/models/drgcms_form_fields/text_field.rb +1 -1
- data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
- data/app/models/drgcms_form_fields/tree_select.rb +15 -4
- data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
- data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
- data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
- data/app/{helpers → renderers}/dc_poll_renderer.rb +91 -64
- data/app/{helpers → renderers}/dc_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
- data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
- data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
- data/app/views/cmsedit/_form.html.erb +4 -3
- data/app/views/cmsedit/_result.html.erb +2 -3
- data/app/views/cmsedit/edit.html.erb +4 -1
- data/app/views/cmsedit/index.html.erb +7 -1
- data/app/views/cmsedit/new.html.erb +3 -1
- 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 +27 -3
- data/config/locales/drgcms_sl.yml +32 -5
- data/config/locales/models_en.yml +65 -17
- data/config/locales/models_sl.yml +69 -18
- data/drg_cms.gemspec +1 -1
- data/lib/drg_cms.rb +61 -1
- data/lib/drg_cms/version.rb +1 -1
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
- data/lib/tasks/database.rake +6 -56
- metadata +73 -54
- data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
- data/app/helpers/application_helper.rb +0 -2
- data/app/helpers/cmsedit_helper.rb +0 -888
- data/app/models/dc_dummy.rb +0 -102
- data/test/fixtures/drg_cms_test_data.rb +0 -87
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#coding: utf-8
|
|
2
1
|
#--
|
|
3
2
|
# Copyright (c) 2012+ Damjan Rems
|
|
4
3
|
#
|
|
@@ -66,8 +65,8 @@ end
|
|
|
66
65
|
####################################################################
|
|
67
66
|
def dc_user_has_role(role)
|
|
68
67
|
role = DcPolicyRole.get_role(role)
|
|
69
|
-
return false if role.nil?
|
|
70
|
-
# role
|
|
68
|
+
return false if role.nil? || session[:user_roles].nil?
|
|
69
|
+
# role exists in user_roles
|
|
71
70
|
session[:user_roles].include?(role._id)
|
|
72
71
|
end
|
|
73
72
|
|
|
@@ -81,22 +80,28 @@ end
|
|
|
81
80
|
# @example Returns Google analytics code from site settings
|
|
82
81
|
# settings = dc_get_site.params['ga_acc']
|
|
83
82
|
####################################################################
|
|
84
|
-
def dc_get_site
|
|
85
|
-
return @site if @site
|
|
83
|
+
def dc_get_site
|
|
84
|
+
return @site if @site
|
|
85
|
+
|
|
86
86
|
uri = URI.parse(request.url)
|
|
87
|
+
cache_key = ['dc_site', uri.host]
|
|
88
|
+
|
|
89
|
+
@site = dc_cache_read(cache_key)
|
|
90
|
+
return @site if @site
|
|
91
|
+
|
|
87
92
|
@site = DcSite.find_by(name: uri.host)
|
|
88
|
-
# Site can be aliased
|
|
89
|
-
if @site
|
|
93
|
+
# Site can be aliased
|
|
94
|
+
if @site && !@site.alias_for.blank?
|
|
90
95
|
@site = DcSite.find_by(name: @site.alias_for)
|
|
91
96
|
end
|
|
92
|
-
# Development environment. Check if site with name test exists and use
|
|
93
|
-
# alias_for as pointer to real site.
|
|
94
|
-
if @site.nil?
|
|
97
|
+
# Development environment. Check if site with name test exists and use
|
|
98
|
+
# alias_for as pointer to real site.
|
|
99
|
+
if @site.nil? && ENV["RAILS_ENV"] != 'production'
|
|
95
100
|
@site = DcSite.find_by(name: 'test')
|
|
96
101
|
@site = DcSite.find_by(name: @site.alias_for) if @site
|
|
97
|
-
end
|
|
98
|
-
@site = nil if @site
|
|
99
|
-
@site
|
|
102
|
+
end
|
|
103
|
+
@site = nil if @site && !@site.active # site is disabled
|
|
104
|
+
dc_cache_write(cache_key, @site)
|
|
100
105
|
end
|
|
101
106
|
|
|
102
107
|
##########################################################################
|
|
@@ -104,8 +109,9 @@ end
|
|
|
104
109
|
#
|
|
105
110
|
# Sets internal @page_title variable.
|
|
106
111
|
##########################################################################
|
|
107
|
-
def set_page_title
|
|
108
|
-
@page_title = @page.title.blank? ?
|
|
112
|
+
def set_page_title
|
|
113
|
+
@page_title = @page.title.blank? ? @page.subject : @page.title
|
|
114
|
+
dc_add_meta_tag(:name, 'description', @page.meta_description)
|
|
109
115
|
end
|
|
110
116
|
|
|
111
117
|
########################################################################
|
|
@@ -114,21 +120,19 @@ end
|
|
|
114
120
|
# @param [String] Form file name. File name can be passed as gem_name.filename. This can
|
|
115
121
|
# be useful when you are extending form but want to retain same name as original form
|
|
116
122
|
# For example. You are extending dc_user form from drg_cms gem and want to
|
|
117
|
-
# retain same dc_user name. This can be done by setting drg_cms.dc_user
|
|
123
|
+
# retain same dc_user name. This can be done by setting drg_cms.dc_user as extend option.
|
|
118
124
|
#
|
|
119
125
|
# @return [String] Form file name including path or nil if not found.
|
|
120
126
|
########################################################################
|
|
121
127
|
def dc_find_form_file(form_file)
|
|
122
|
-
form_path=nil
|
|
123
|
-
if form_file.match(/\.|\//)
|
|
124
|
-
|
|
125
|
-
end
|
|
128
|
+
form_path = nil
|
|
129
|
+
form_path, form_file = form_file.split(/\.|\//) if form_file.match(/\.|\//)
|
|
130
|
+
|
|
126
131
|
DrgCms.paths(:forms).reverse.each do |path|
|
|
127
132
|
f = "#{path}/#{form_file}.yml"
|
|
128
|
-
return f if File.exist?(f)
|
|
133
|
+
return f if File.exist?(f) && (form_path.nil? || path.to_s.match(/\/#{form_path}(-|\/)/i))
|
|
129
134
|
end
|
|
130
|
-
|
|
131
|
-
nil
|
|
135
|
+
raise "Exception: Form file '#{form_file}' not found!"
|
|
132
136
|
end
|
|
133
137
|
|
|
134
138
|
#######################################################################
|
|
@@ -141,7 +145,7 @@ end
|
|
|
141
145
|
# return dc_render_404('Site') unless site
|
|
142
146
|
########################################################################
|
|
143
147
|
def dc_render_404(where_the_error_is=nil)
|
|
144
|
-
logger.info("Error 404;#{request.env['REQUEST_URI']};#{request.referer};#{where_the_error_is}")
|
|
148
|
+
logger.info("Error 404;#{request.env['REQUEST_URI'] rescue ''};#{request.referer};#{where_the_error_is}")
|
|
145
149
|
render(file: Rails.root.join('public/404.html'), status: 404)
|
|
146
150
|
end
|
|
147
151
|
|
|
@@ -165,15 +169,7 @@ end
|
|
|
165
169
|
|
|
166
170
|
protected
|
|
167
171
|
|
|
168
|
-
|
|
169
|
-
# Add permissions. Subroutine of dc_user_can
|
|
170
|
-
############################################################################
|
|
171
|
-
def add_permissions_for(table_name=nil) # :nodoc:
|
|
172
|
-
perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
|
|
173
|
-
(perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
############################################################################
|
|
172
|
+
###########################################################################
|
|
177
173
|
# Checks if user can perform (read, create, edit, delete) document in specified
|
|
178
174
|
# table (collection).
|
|
179
175
|
#
|
|
@@ -185,26 +181,75 @@ end
|
|
|
185
181
|
# @Example True when user has view permission on the table
|
|
186
182
|
# if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
|
|
187
183
|
############################################################################
|
|
188
|
-
def dc_user_can(permission, table=params[:table])
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
184
|
+
def dc_user_can(permission, table = params[:table])
|
|
185
|
+
permissions = DcPermission.permissions_for_table(table)
|
|
186
|
+
session[:user_roles].each {|r| return true if permissions[r] && permissions[r] >= permission }
|
|
187
|
+
false
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def dc_user_can(permission, table = params[:table])
|
|
191
|
+
cache_key = ['dc_permission', table, session[:user_id], dc_get_site.id]
|
|
192
|
+
permissions = dc_cache_read(cache_key)
|
|
193
|
+
if permissions.nil?
|
|
194
|
+
permissions = DcPermission.permissions_for_table(table)
|
|
195
|
+
dc_cache_write(cache_key, permissions)
|
|
198
196
|
end
|
|
199
|
-
|
|
200
|
-
session[:user_roles].each {|r| return true if @permissions[r] and @permissions[r] >= permission }
|
|
197
|
+
session[:user_roles].each {|r| return true if permissions[r] && permissions[r] >= permission }
|
|
201
198
|
false
|
|
202
|
-
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
####################################################################
|
|
202
|
+
# Read from cache
|
|
203
|
+
#
|
|
204
|
+
# @keys [Array] Array of keys
|
|
205
|
+
#
|
|
206
|
+
# @return [Object] Data returned from cache
|
|
207
|
+
####################################################################
|
|
208
|
+
def dc_cache_read(keys)
|
|
209
|
+
if redis_cache_store?
|
|
210
|
+
keys = keys.dup
|
|
211
|
+
first = keys.shift
|
|
212
|
+
data = redis.hget(first, keys.join(''))
|
|
213
|
+
data ? Marshal.load(data) : nil
|
|
214
|
+
else
|
|
215
|
+
Rails.cache.read(keys.join(''))
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def __dc_cache_read(keys)
|
|
220
|
+
p 'read', keys.join(''), Rails.cache.instance_variable_get(:@data).keys
|
|
221
|
+
pp Rails.cache.read(keys.join(''))
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
####################################################################
|
|
225
|
+
# Write data to cache
|
|
226
|
+
#
|
|
227
|
+
# @param [Array] Array of keys
|
|
228
|
+
# @param [Object] Data written to cache
|
|
229
|
+
#
|
|
230
|
+
# @return [Object] data so dc_cache_write can be used as last statement in method.
|
|
231
|
+
####################################################################
|
|
232
|
+
def dc_cache_write(keys, data)
|
|
233
|
+
if redis_cache_store?
|
|
234
|
+
keys = keys.dup
|
|
235
|
+
first = keys.shift
|
|
236
|
+
redis.hset(first, keys.join(''), Marshal.dump(data))
|
|
237
|
+
else
|
|
238
|
+
Rails.cache.write(keys.join(''), data)
|
|
239
|
+
end
|
|
240
|
+
data
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def __dc_cache_write(keys, data)
|
|
244
|
+
p 'write', keys.join('')
|
|
245
|
+
pp Rails.cache.write(keys.join(''), data)
|
|
246
|
+
data
|
|
247
|
+
end
|
|
203
248
|
|
|
204
249
|
####################################################################
|
|
205
|
-
# Detects if called from mobile agent according to http://detectmobilebrowsers.com/
|
|
250
|
+
# Detects if called from mobile agent according to http://detectmobilebrowsers.com/
|
|
206
251
|
# and set session[:is_mobile]
|
|
207
|
-
#
|
|
252
|
+
#
|
|
208
253
|
# Detect also if caller is a robot and set session[:is_robot]
|
|
209
254
|
####################################################################
|
|
210
255
|
def dc_set_is_mobile
|
|
@@ -212,13 +257,12 @@ def dc_set_is_mobile
|
|
|
212
257
|
: false
|
|
213
258
|
session[:is_mobile] = is_mobile ? 1 : 0
|
|
214
259
|
#
|
|
215
|
-
if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
|
260
|
+
if request.env["HTTP_USER_AGENT "] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
|
216
261
|
logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
|
|
217
262
|
session[:is_robot] = true
|
|
218
263
|
end
|
|
219
264
|
end
|
|
220
265
|
|
|
221
|
-
|
|
222
266
|
##########################################################################
|
|
223
267
|
# Merge values from parameters fields (from site, page ...) into internal @options hash.
|
|
224
268
|
#
|
|
@@ -281,28 +325,32 @@ def get_design_and_render(design_doc)
|
|
|
281
325
|
site_top = '<%= dc_page_top %>'
|
|
282
326
|
site_bottom = '<%= dc_page_bottom %>'
|
|
283
327
|
# lets try the rails way
|
|
284
|
-
if @options[:control]
|
|
328
|
+
if @options[:control] && @options[:action]
|
|
285
329
|
controller = "#{@options[:control]}_control".classify.constantize rescue nil
|
|
286
330
|
extend controller if controller
|
|
287
331
|
return send @options[:action] if respond_to?(@options[:action])
|
|
288
332
|
end
|
|
289
|
-
#
|
|
333
|
+
# design doc present
|
|
290
334
|
if design_doc
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
design = site_top + design_doc.body + site_bottom
|
|
297
|
-
return render(inline: design, layout: layout)
|
|
335
|
+
# defined as rails view
|
|
336
|
+
design = if design_doc.rails_view.blank? || design_doc.rails_view == 'site'
|
|
337
|
+
@site.rails_view
|
|
338
|
+
else
|
|
339
|
+
design_doc.rails_view
|
|
298
340
|
end
|
|
341
|
+
return render design, layout: layout unless design.blank?
|
|
342
|
+
# defined as inline code
|
|
343
|
+
design = design_doc.body.blank? ? @site.design : design_doc.body
|
|
344
|
+
design = site_top + design + site_bottom
|
|
345
|
+
return render(inline: design, layout: layout) unless design.blank?
|
|
299
346
|
end
|
|
300
|
-
#
|
|
301
|
-
if @site.rails_view.blank?
|
|
347
|
+
# Design doc not defined
|
|
348
|
+
if @site.rails_view.blank?
|
|
302
349
|
design = site_top + @site.design + site_bottom
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
350
|
+
render(inline: design, layout: layout)
|
|
351
|
+
else
|
|
352
|
+
render @site.rails_view, layout: layout
|
|
353
|
+
end
|
|
306
354
|
end
|
|
307
355
|
|
|
308
356
|
##########################################################################
|
|
@@ -319,34 +367,34 @@ end
|
|
|
319
367
|
# dc_process_default_request
|
|
320
368
|
# end
|
|
321
369
|
##########################################################################
|
|
322
|
-
def dc_process_default_request
|
|
370
|
+
def dc_process_default_request
|
|
323
371
|
session[:edit_mode] ||= 0
|
|
324
|
-
# Initialize parts
|
|
372
|
+
# Initialize parts
|
|
325
373
|
@parts = nil
|
|
326
374
|
@js, @css = '', ''
|
|
327
|
-
# find domain name in sites
|
|
375
|
+
# find domain name in sites
|
|
328
376
|
@site = dc_get_site
|
|
329
|
-
# site not defined. render 404 error
|
|
377
|
+
# site not defined. render 404 error
|
|
330
378
|
return dc_render_404('Site!') if @site.nil?
|
|
379
|
+
|
|
331
380
|
dc_set_options(@site.settings)
|
|
332
|
-
# HOMEPAGE. When no parameters is set
|
|
381
|
+
# HOMEPAGE. When no parameters is set
|
|
333
382
|
params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
|
|
334
|
-
@options[:path] = params[:path].to_s.split('/')
|
|
383
|
+
@options[:path] = params[:path].to_s.downcase.split('/')
|
|
335
384
|
params[:path] = @options[:path].first if @options[:path].size > 1
|
|
336
|
-
# some other process request. It should fail if not defined
|
|
385
|
+
# some other process request. It should fail if not defined
|
|
337
386
|
return send(@site.request_processor) unless @site.request_processor.blank?
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
pageclass = @site.page_table.classify.constantize
|
|
387
|
+
# Search for page
|
|
388
|
+
pageclass = @site.page_klass
|
|
341
389
|
if params[:id]
|
|
342
390
|
#Page.where(id: params[:id]).or(subject_link: params[:id]).first
|
|
343
391
|
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
|
|
344
392
|
@page = pageclass.find(params[:id]) if @page.nil? # I think that there will be more subject_link searchers than id
|
|
345
393
|
elsif params[:path]
|
|
346
|
-
# path may point direct to page's subject_link
|
|
394
|
+
# path may point direct to page's subject_link
|
|
347
395
|
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:path], active: true)
|
|
348
396
|
if @page.nil?
|
|
349
|
-
# no. Find if defined in links
|
|
397
|
+
# no. Find if defined in links
|
|
350
398
|
link = DcLink.find_by(:dc_site_id.in => [@site._id, nil], name: params[:path])
|
|
351
399
|
if link
|
|
352
400
|
#pageclass.find_by(alt_link: params[:path])
|
|
@@ -355,29 +403,32 @@ def dc_process_default_request()
|
|
|
355
403
|
end
|
|
356
404
|
end
|
|
357
405
|
end
|
|
358
|
-
# if @page is not found render 404 error
|
|
406
|
+
# if @page is not found render 404 error
|
|
359
407
|
return dc_render_404('Page!') unless @page
|
|
360
|
-
dc_set_options @page.params
|
|
361
408
|
dc_set_is_mobile unless session[:is_mobile] # do it only once per session
|
|
362
|
-
# find design if defined. Otherwise design MUST be declared in site
|
|
409
|
+
# find design if defined. Otherwise design MUST be declared in site
|
|
363
410
|
if @page.dc_design_id
|
|
364
411
|
@design = DcDesign.find(@page.dc_design_id)
|
|
365
412
|
return dc_render_404('Design!') unless @design
|
|
366
413
|
end
|
|
367
|
-
|
|
414
|
+
dc_set_options @design.params if @design
|
|
415
|
+
dc_set_options @page.params
|
|
416
|
+
dc_add_json_ld(@page.get_json_ld)
|
|
417
|
+
# Add edit menu
|
|
368
418
|
if session[:edit_mode] > 0
|
|
369
419
|
session[:site_id] = @site.id
|
|
370
|
-
session[:
|
|
420
|
+
session[:site_page_class] = @site.page_class
|
|
371
421
|
session[:page_id] = @page.id
|
|
372
|
-
else
|
|
373
|
-
# Log only visits from non-editors
|
|
422
|
+
else
|
|
423
|
+
# Log only visits from non-editors
|
|
374
424
|
dc_log_visit()
|
|
375
425
|
end
|
|
376
426
|
set_page_title()
|
|
377
427
|
get_design_and_render @design
|
|
378
428
|
end
|
|
379
429
|
|
|
380
|
-
|
|
430
|
+
######
|
|
431
|
+
# ####################################################################
|
|
381
432
|
# Single site document kind of request handler.
|
|
382
433
|
#
|
|
383
434
|
# This request handler assumes that all data for the site is saved in the site document.
|
|
@@ -458,7 +509,7 @@ eot
|
|
|
458
509
|
end
|
|
459
510
|
|
|
460
511
|
####################################################################
|
|
461
|
-
# Checks if any errors exist on document and writes
|
|
512
|
+
# Checks if any errors exist on document and writes error log. It can also
|
|
462
513
|
# crash if requested. This is mostly usefull in development for debuging
|
|
463
514
|
# model errors or when saving to multiple collections and where each save must be
|
|
464
515
|
# checked if succesfull.
|
|
@@ -477,14 +528,7 @@ end
|
|
|
477
528
|
#
|
|
478
529
|
####################################################################
|
|
479
530
|
def dc_check_model(document, crash=false)
|
|
480
|
-
|
|
481
|
-
msg = ''
|
|
482
|
-
document.errors.each do |attribute, errors_array|
|
|
483
|
-
msg << "#{attribute}: #{errors_array}\n"
|
|
484
|
-
end
|
|
485
|
-
logger.debug(msg) if msg.size > 0
|
|
486
|
-
crash_it if crash
|
|
487
|
-
msg
|
|
531
|
+
DrgCms.model_check(document, crash)
|
|
488
532
|
end
|
|
489
533
|
|
|
490
534
|
######################################################################
|
|
@@ -508,7 +552,7 @@ end
|
|
|
508
552
|
# can be found in drg_cms.js file.
|
|
509
553
|
#
|
|
510
554
|
# @param [Hash] Options
|
|
511
|
-
#
|
|
555
|
+
#
|
|
512
556
|
# @return [JSON Response] Formatted to be used for ajax return.
|
|
513
557
|
#
|
|
514
558
|
# @example
|
|
@@ -520,7 +564,7 @@ end
|
|
|
520
564
|
######################################################################
|
|
521
565
|
def dc_render_ajax(opts)
|
|
522
566
|
result = {}
|
|
523
|
-
if opts[:div]
|
|
567
|
+
if opts[:div] || opts[:class]
|
|
524
568
|
selector = opts[:div] ? '#' : '.' # for div . for class
|
|
525
569
|
key = case
|
|
526
570
|
when opts[:prepend] then "#{selector}+div"
|
|
@@ -529,11 +573,11 @@ def dc_render_ajax(opts)
|
|
|
529
573
|
end
|
|
530
574
|
key << "_#{opts[:div]}#{opts[:class]}"
|
|
531
575
|
else
|
|
532
|
-
|
|
576
|
+
logger.error 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
|
|
533
577
|
key = "#{opts[:operation]}_"
|
|
534
578
|
end
|
|
535
579
|
result[key] = opts[:value] || opts[:url] || ''
|
|
536
|
-
render
|
|
580
|
+
render json: result
|
|
537
581
|
end
|
|
538
582
|
|
|
539
583
|
########################################################################
|
|
@@ -542,7 +586,7 @@ end
|
|
|
542
586
|
# @param [String] Table (collection) name. Could be dc_page;dc_part;... when searching for embedded document.
|
|
543
587
|
# @param [String] Id of the document
|
|
544
588
|
# @param [String] Ids of parent documents when document is embedded. Ids are separated by ; char.
|
|
545
|
-
#
|
|
589
|
+
#
|
|
546
590
|
# @return [document]. Required document or nil if not found.
|
|
547
591
|
#
|
|
548
592
|
# @example As used in Cmsedit_controller
|
|
@@ -587,25 +631,34 @@ def clear_login_data
|
|
|
587
631
|
session[:edit_mode] = 0
|
|
588
632
|
session[:user_id] = nil
|
|
589
633
|
session[:user_name] = nil
|
|
590
|
-
|
|
634
|
+
set_default_guest_user_role
|
|
591
635
|
cookies.delete :remember_me
|
|
592
636
|
end
|
|
593
637
|
|
|
638
|
+
############################################################################
|
|
639
|
+
# Sets at least default guest user to user roles when no user is set.
|
|
640
|
+
############################################################################
|
|
641
|
+
def set_default_guest_user_role
|
|
642
|
+
guest = DcPolicyRole.find_by(system_name: 'guest')
|
|
643
|
+
session[:user_roles] = [guest.id] if guest
|
|
644
|
+
end
|
|
645
|
+
|
|
594
646
|
####################################################################
|
|
595
647
|
# Fills session with data related to successful login.
|
|
596
|
-
#
|
|
648
|
+
#
|
|
597
649
|
# @param [DcUser] user : User's document
|
|
598
650
|
# @param [Boolean] remember_me : false by default
|
|
599
651
|
####################################################################
|
|
600
652
|
def fill_login_data(user, remember_me=false)
|
|
601
653
|
session[:user_id] = user.id if user
|
|
602
654
|
session[:user_name] = user.name if user
|
|
603
|
-
session[:edit_mode] = 0
|
|
655
|
+
session[:edit_mode] = 0
|
|
604
656
|
session[:user_roles] = []
|
|
605
657
|
# Every user has guest role
|
|
606
|
-
guest = DcPolicyRole.find_by(system_name: 'guest')
|
|
607
|
-
session[:user_roles] << guest.id if guest
|
|
608
|
-
|
|
658
|
+
# guest = DcPolicyRole.find_by(system_name: 'guest')
|
|
659
|
+
# session[:user_roles] << guest.id if guest
|
|
660
|
+
set_default_guest_user_role
|
|
661
|
+
return unless user and user.active
|
|
609
662
|
# special for SUPERADMIN
|
|
610
663
|
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
|
611
664
|
if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
|
@@ -617,7 +670,7 @@ def fill_login_data(user, remember_me=false)
|
|
|
617
670
|
policy_site = dc_get_site()
|
|
618
671
|
policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
|
|
619
672
|
default_policy = policy_site.dc_policies.find_by(is_default: true)
|
|
620
|
-
# load user roles
|
|
673
|
+
# load user roles
|
|
621
674
|
user.dc_user_roles.each do |role|
|
|
622
675
|
next unless role.active
|
|
623
676
|
next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
|
|
@@ -625,7 +678,7 @@ def fill_login_data(user, remember_me=false)
|
|
|
625
678
|
# check if role is active in this site
|
|
626
679
|
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
|
627
680
|
next unless policy_role
|
|
628
|
-
# set edit_mode
|
|
681
|
+
# set edit_mode
|
|
629
682
|
session[:edit_mode] = 1 if policy_role.permission > 1
|
|
630
683
|
session[:user_roles] << role.dc_policy_role_id
|
|
631
684
|
end
|
|
@@ -635,15 +688,75 @@ def fill_login_data(user, remember_me=false)
|
|
|
635
688
|
end
|
|
636
689
|
end
|
|
637
690
|
|
|
691
|
+
####################################################################
|
|
692
|
+
# Fills session with data related to successful login.
|
|
693
|
+
#
|
|
694
|
+
# @param [DcUser] user : User's document
|
|
695
|
+
# @param [Boolean] remember_me : false by default
|
|
696
|
+
####################################################################
|
|
697
|
+
def fill_login_data(user, remember_me = false)
|
|
698
|
+
session[:user_id] = user.id if user
|
|
699
|
+
session[:user_name] = user.name if user
|
|
700
|
+
session[:edit_mode] = 0
|
|
701
|
+
set_default_guest_user_role
|
|
702
|
+
return unless user&.active
|
|
703
|
+
|
|
704
|
+
# special for SUPERADMIN
|
|
705
|
+
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
|
706
|
+
if sa && (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
|
707
|
+
session[:user_roles] << role.dc_policy_role_id
|
|
708
|
+
session[:edit_mode] = 2
|
|
709
|
+
return
|
|
710
|
+
end
|
|
711
|
+
# read default policy from site. Policy might be inherited from other site
|
|
712
|
+
policy_site = dc_get_site()
|
|
713
|
+
policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
|
|
714
|
+
default_policy = policy_site.dc_policies.find_by(is_default: true)
|
|
715
|
+
|
|
716
|
+
# load user roles from groups
|
|
717
|
+
roles = {}
|
|
718
|
+
user.member.each do |group_id|
|
|
719
|
+
group = DcUser.find(group_id)
|
|
720
|
+
next unless group.active
|
|
721
|
+
|
|
722
|
+
group.dc_user_roles.each do |role|
|
|
723
|
+
next unless role.active?
|
|
724
|
+
roles[role.dc_policy_role_id] = role
|
|
725
|
+
end
|
|
726
|
+
end unless user.member.blank?
|
|
727
|
+
|
|
728
|
+
# load user roles from user
|
|
729
|
+
user.dc_user_roles.each do |role|
|
|
730
|
+
# not active in user roles will remove role defined in groups
|
|
731
|
+
unless role.active?
|
|
732
|
+
roles.delete(role.dc_policy_role_id) if roles[role.dc_policy_role_id]
|
|
733
|
+
next
|
|
734
|
+
end
|
|
735
|
+
roles[role.dc_policy_role_id] = role
|
|
736
|
+
end
|
|
737
|
+
# select only roles defined in default site policy and set edit_mode
|
|
738
|
+
roles.each do |key, role|
|
|
739
|
+
# check if role is active in this site
|
|
740
|
+
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
|
741
|
+
next unless policy_role
|
|
742
|
+
# set edit_mode
|
|
743
|
+
session[:edit_mode] = 1 if policy_role.permission > 1
|
|
744
|
+
session[:user_roles] << role.dc_policy_role_id
|
|
745
|
+
end
|
|
746
|
+
# Save remember me cookie if not CMS user and remember me is selected
|
|
747
|
+
if session[:edit_mode] == 0 && remember_me
|
|
748
|
+
cookies.signed[:remember_me] = { value: user.id, expires: 180.days.from_now }
|
|
749
|
+
end
|
|
750
|
+
end
|
|
751
|
+
|
|
638
752
|
##########################################################################
|
|
639
|
-
# Will check if user's login data is
|
|
753
|
+
# Will check if user's login data is still valid and reload user roles.
|
|
640
754
|
#
|
|
641
755
|
# @param [Time] repeat_after : Check is repeated after time. This is by default performed every 24 hours.
|
|
642
756
|
##########################################################################
|
|
643
|
-
def dc_check_user_still_valid(repeat_after=1.day)
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
# last check more than a day ago
|
|
757
|
+
def dc_check_user_still_valid(repeat_after = 1.day)
|
|
758
|
+
return if session[:user_id].nil?
|
|
759
|
+
# last check more than repeat_after ago
|
|
647
760
|
if (session[:user_chk] ||= Time.now) < repeat_after.ago
|
|
648
761
|
user_id = session[:user_id]
|
|
649
762
|
clear_login_data
|
|
@@ -654,4 +767,158 @@ def dc_check_user_still_valid(repeat_after=1.day)
|
|
|
654
767
|
end
|
|
655
768
|
end
|
|
656
769
|
|
|
770
|
+
##########################################################################
|
|
771
|
+
# Evaluates Class.method in more predictable context then just calling eval
|
|
772
|
+
#
|
|
773
|
+
# @param [String] class_method defined as MyClass.method_name
|
|
774
|
+
# @param [Object] optional parameters send to class_method
|
|
775
|
+
##########################################################################
|
|
776
|
+
def dc_eval_class_method(class_method, params = nil)
|
|
777
|
+
klass, method = class_method.split('.')
|
|
778
|
+
# check if class exists
|
|
779
|
+
klass = klass.classify.constantize rescue nil
|
|
780
|
+
if klass.nil?
|
|
781
|
+
logger.error " Class in #{class_method} not defined!"
|
|
782
|
+
return nil
|
|
783
|
+
end
|
|
784
|
+
# call method
|
|
785
|
+
if klass.respond_to?(method)
|
|
786
|
+
klass.send(method, params)
|
|
787
|
+
else
|
|
788
|
+
logger.error "Method in #{class_method} not defined!"
|
|
789
|
+
nil
|
|
790
|
+
end
|
|
791
|
+
end
|
|
792
|
+
|
|
793
|
+
##########################################################################
|
|
794
|
+
# Will add new element to json_ld structure
|
|
795
|
+
#
|
|
796
|
+
# Parameters:
|
|
797
|
+
# [element] Hash or Array of hashes:
|
|
798
|
+
##########################################################################
|
|
799
|
+
def dc_add_json_ld(element)
|
|
800
|
+
@json_ld ||= []
|
|
801
|
+
if element.class == Array
|
|
802
|
+
@json_ld += element
|
|
803
|
+
else
|
|
804
|
+
@json_ld << element
|
|
805
|
+
end
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
########################################################################
|
|
809
|
+
# Will add a meta tag to internal hash structure. If meta tag already exists it
|
|
810
|
+
# will be overwritten.
|
|
811
|
+
#
|
|
812
|
+
# Parameters:
|
|
813
|
+
# [name] String: meta name
|
|
814
|
+
# [content] String: meta content
|
|
815
|
+
#
|
|
816
|
+
########################################################################
|
|
817
|
+
def dc_add_meta_tag(type, name, content)
|
|
818
|
+
return if content.blank?
|
|
819
|
+
|
|
820
|
+
@meta_tags ||= {}
|
|
821
|
+
key = "#{type}=\"#{name}\""
|
|
822
|
+
@meta_tags[key] = content
|
|
823
|
+
end
|
|
824
|
+
|
|
825
|
+
########################################################################
|
|
826
|
+
# Will prepare flash[:update] data, which will be used for updating fields
|
|
827
|
+
# on forms parent form fields.
|
|
828
|
+
#
|
|
829
|
+
# Parameters:
|
|
830
|
+
# [field_name] String: Field name
|
|
831
|
+
# [value] String: New value
|
|
832
|
+
# [readonly] Boolean: Field is readonly
|
|
833
|
+
#
|
|
834
|
+
########################################################################
|
|
835
|
+
def dc_update_form_field(field_name, value, readonly=false)
|
|
836
|
+
dc_deprecate('dc_update_form_field will be deprecated. Use dc_update_form_element instead.')
|
|
837
|
+
key_name = (readonly ? 'td_' : '') + "record_#{field_name}"
|
|
838
|
+
flash[:update] ||= {}
|
|
839
|
+
flash[:update][key_name] = value
|
|
840
|
+
end
|
|
841
|
+
|
|
842
|
+
########################################################################
|
|
843
|
+
# Will prepare flash[:update] data, which will be used for updating elements
|
|
844
|
+
# on parent form.
|
|
845
|
+
#
|
|
846
|
+
# dc_update_form_field will be deprecated eventually.
|
|
847
|
+
#
|
|
848
|
+
# Parameters passed as hash:
|
|
849
|
+
# [field] String: Field name
|
|
850
|
+
# [head] String: Filed name in head of form
|
|
851
|
+
# [value] String: New value
|
|
852
|
+
# [readonly] Boolean: Field is readonly
|
|
853
|
+
#
|
|
854
|
+
########################################################################
|
|
855
|
+
def dc_update_form_element(field: nil, head: nil, value:, readonly: true)
|
|
856
|
+
key = if field
|
|
857
|
+
(readonly ? 'td_' : '') + "record_#{field}"
|
|
858
|
+
elsif head
|
|
859
|
+
"head-#{head}"
|
|
860
|
+
end
|
|
861
|
+
|
|
862
|
+
if key
|
|
863
|
+
flash[:update] ||= {}
|
|
864
|
+
flash[:update][key] = value
|
|
865
|
+
end
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
####################################################################
|
|
869
|
+
# Checks if any errors exist on document and writes error log. It can also
|
|
870
|
+
# crash if requested. This is mostly usefull in development for debuging
|
|
871
|
+
# model errors or when updating multiple collections and each save must be
|
|
872
|
+
# checked if succesfull.
|
|
873
|
+
#
|
|
874
|
+
# @param [Document] Document object which will be checked
|
|
875
|
+
# @param [Boolean] If true method should end in runtime error. Default = false.
|
|
876
|
+
#
|
|
877
|
+
# @return [String] Error messages or empty string if everything is OK.
|
|
878
|
+
#
|
|
879
|
+
# @Example Check for error when data is saved.
|
|
880
|
+
# model.save
|
|
881
|
+
# if (msg = DcApplicationController.dc_check_model(model) ).size > 0
|
|
882
|
+
# p msg
|
|
883
|
+
# error process ......
|
|
884
|
+
# end
|
|
885
|
+
#
|
|
886
|
+
####################################################################
|
|
887
|
+
def self.dc_check_model(document, crash = false)
|
|
888
|
+
DrgCms.model_check(document, crash)
|
|
889
|
+
end
|
|
890
|
+
|
|
891
|
+
########################################################################
|
|
892
|
+
# Will dump exception to rails log and console.
|
|
893
|
+
#
|
|
894
|
+
# Parameters:
|
|
895
|
+
# [exception] Object: Exception caught
|
|
896
|
+
#
|
|
897
|
+
########################################################################
|
|
898
|
+
def dc_dump_exception(exception)
|
|
899
|
+
msg = [exception.message, *exception.backtrace].join($/)
|
|
900
|
+
pp msg
|
|
901
|
+
Rails.logger.error msg
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
private
|
|
905
|
+
|
|
906
|
+
########################################################################
|
|
907
|
+
# Determines if redis cache store is active
|
|
908
|
+
#
|
|
909
|
+
# @return [Boolean] : True if redis cache store is active
|
|
910
|
+
########################################################################
|
|
911
|
+
def redis_cache_store?
|
|
912
|
+
(Rails.application.config.cache_store.first == :redis_cache_store) rescue false
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
########################################################################
|
|
916
|
+
# Returns redis object
|
|
917
|
+
#
|
|
918
|
+
# @return [Object] : Redis object
|
|
919
|
+
########################################################################
|
|
920
|
+
def redis
|
|
921
|
+
Rails.cache.redis
|
|
922
|
+
end
|
|
923
|
+
|
|
657
924
|
end
|