drg_cms 0.6.0.1 → 0.6.1.1.1
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 +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
|